我正在尝试使用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
调用映射到使用您感兴趣Promise
的tweets
变量解析的a ,然后调用Promise.all
这些Promises的数组。Promise.all
接受一个数组,Promises
并返回Promise
,一旦传递的数组中的每个Promise都解析后,该解析就解决了。
请注意,您似乎正在忽略err
可能返回的结果T.get
-这可能不是一个好主意,最好能够检查何时发生错误,然后以某种方式处理错误(否则,tweetHold
数组有时可能包含损坏的数据)。幸运的是,如果您使用Promises,则实现起来很简单-只需reject
在err
和catch
之后加上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] 删除。
我来说两句