T.get
принимает функцию обратного вызова, которая вызывается после выполнения асинхронной операции.Но так как вы хотите получить несколько ответов, а не только один, использование только обратных вызовов само по себе будет немного грязно.Например, внутри returnedTweets
вы можете увеличивать постоянную переменную-счетчик и вызывать следующую функцию один раз counter === searchArray.users.length
, но вместо этого было бы более элегантно использовать Promises.
Отобразить каждый T.get
вызовPromise
, который разрешается с помощью интересующей вас переменной tweets
, а затем вызывает Promise.all
для массива этих Обещаний.Promise.all
принимает массив Promises
и возвращает Promise
, который разрешается после разрешения каждого Promise в переданном массиве.
Обратите внимание, что похоже, что в данный момент вы игнорируете err
, который можетвернитесь из T.get
- это, вероятно, не очень хорошая идея, было бы лучше иметь возможность проверить, когда возникают ошибки, а затем каким-то образом обработать ошибку (в противном случае массив tweetHold
может иногда содержать поврежденные данные).К счастью, если вы используете Обещания, реализовать это легко - просто 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
});