【问题标题】:Multiple Callback Functions with the Node Twitter Library使用 Node Twitter 库的多个回调函数
【发布时间】:2019-05-14 23:50:42
【问题描述】:

我正在尝试使用 Twitter for Node 向 Twitter 发出请求,并将响应存储在一个数组中以供以后处理。我将返回的推文推送到一个数组,每个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);

【问题讨论】:

    标签: node.js asynchronous twitter callback


    【解决方案1】:

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

    将每个 T.get 调用映射到使用您感兴趣的 tweets 变量解析的 Promise,然后在这些 Promise 的数组上调用 Promise.allPromise.all 接受一个 Promises 数组并返回一个 Promise,它会在传递的数组中的每个 Promise 都解析后解析。

    请注意,您当前似乎忽略了可能从 T.get 返回的 err - 这可能不是一个好主意,最好能够检查何时发生错误,然后处理以某种方式出错(否则,tweetHold 数组有时可能包含损坏的数据)。幸运的是,如果你使用 Promises,实现这一点很容易——如果err 后面有reject,则只需catchPromise.all 后面还有catch

    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
      });
    

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      相关资源
      最近更新 更多