Node Twitter库具有多种回调功能

马卡克图拉

我正在尝试使用Twitter的Node向Twitter发送请求,并将响应存储在数组中以供以后处理。我正在将返回的tweet推入数组,每个push()发生在回调中,这似乎工作正常。我的问题是我无法通过所有推送的推文访问整个阵列。

原因当然是,在Twitter API的结果到达之前,任何尝试使用该数组的尝试都会被调用,因此我得到的是一个空数组。

我如何(也应该)将函数与整个数组一起使用到另一个回调中?我是从仍然试图牢牢掌握异步编程的角度出发的,尤其是必须异步运行的多个回调或函数。

同样,当前结果是tweetHold = [],我想tweetHold在中包含所有用户的所有匹配推文searchArray

let searchArray = {
  users: ['ByBuddha', 'thetweetofgod']
}

let tweetHold = [];  

let T = new Twitter(config);

for (user of searchArray.users) {

  let params = {
    q: 'from:'+ user,
    count: 1,
    tweet_mode: 'extended',
    result_type: 'recent',
    lang: 'en'
  }

  T.get('search/tweets', params, returnedTweets);

}

function returnedTweets(err, tweets, response) {
  tweetHold.push(tweets);
}

// obviously, doesn't work as the array is logged to console before T.get() is done
console.log(tweetHold);
一定的表现

T.get接受异步操作完成后被调用的回调函数。但是由于您希望获得多个响应,而不仅仅是一个响应,因此仅使用回调本身会有些混乱。例如,在inside中returnedTweets,您可以增加一个持久计数器变量,然后一次调用下一个函数counter === searchArray.users.length,但是使用Promises会更优雅。

将每个T.get调用映射到使用您感兴趣Promisetweets变量解析的a 然后调用Promise.all这些Promises的数组。Promise.all接受一个数组,Promises并返回Promise,一旦传递的数组中的每个Promise都解析后,该解析就解决了。

请注意,您似乎正在忽略err可能返回的结果T.get-这可能不是一个好主意,最好能够检查何时发生错误,然后以某种方式处理错误(否则,tweetHold数组有时可能包含损坏的数据)。幸运的是,如果您使用Promises,则实现起来很简单-只需rejecterrcatch之后加上Promise.all

const T = new Twitter(config);
const searchObject = {
  users: ['ByBuddha', 'thetweetofgod']
};

const searchPromises = searchArray.users.map((user) => {
  return new Promise((resolve, reject) => {
    const params = {
      q: 'from:'+ user,
      count: 1,
      tweet_mode: 'extended',
      result_type: 'recent',
      lang: 'en'
    };
    T.get('search/tweets', params, (err, tweets) => {
      if (err) reject(err);
      else resolve(tweets);
    });
  });
});

Promise.all(searchPromises)
  .then((tweetHold) => {
    // tweetHold will be an array containing the `tweets` variable for each user searched
    console.log(tweetHold);
  })
  .catch((err) => {
    // there was an error, best to handle it somehow
    // the `.then` above will not be entered
  });

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章