Использование Q.allSettled для цепочки обещаний внутри цикла
Я использую большую библиотеку Q для обещаний с IndexedDB, поддерживаемых в приложении Chrome. Проблема в том, что Q.allSettled вызывается до завершения всех методов в цепочке обещаний.
У меня есть две таблицы:
- Таблица search_queries со списком поисковых запросов и
- Таблица твитов, в которой есть список твитов.
Автоматический поиск всех поисковых запросов выполняется так:
var promises = [];
var sq_count = 0;
search_queries.foreach(function (val, index, array) {
// 1. Search Twitter Asynchronously
// 2. Then Add them to a tweets table
// 3. Then update a search queries table
promises.push(
// Call Twitter API
search_twitter(Q, val)
.then(function(tweets) {
// Add Tweets to tweets table
return (add_tweets(Q, tweets, val));
})
// Update number of tweets in search_queries table
.then(function(search_query){
// Update counts for search_search query and store it
return update_search_query_after_search(search_query);
})
.then(function(v){
console.log("Chain is completed");
)); // Close promise chain
sq_count ++;
if(sq_count == search_query_list.length) {
Q.allSettled(promises)
.then(function(result) {
console.log("All Promises Settled);
});
}); // Close foreach loop
Количество твитов в таблице твитов не совпадает с количеством твитов в таблице search_query после запуска метода update_search_query_after_search.
2 ответа
Ваш код может быть упрощен до
var promises = search_queries.map(function(val, index, array) {
return search_twitter(Q, val).then(function(tweets) {
return add_tweets(Q, tweets, val);
}).then(function(search_query) {
return update_search_query_after_search(search_query);
}).then(function(v) {
console.log("Chain is completed");
});
});
Q.allSettled(promises).then(function(result) {
console.log("All Promises Settled");
});
Посмотрите, работает ли это для вас
Вы можете заявить об этом гораздо более простым (и менее подверженным ошибкам) способом, сопоставляя обещания из исходного массива:
//no need to state extra function params if you're not using them
var promises = search_queries.map(function(val){
return search_twitter(Q, val)
.then(function(tweets) {
// Add Tweets to tweets table
return (add_tweets(Q, tweets, val));
})
// Update number of tweets in search_queries table
.then(function(search_query){
// Update counts for search_search query and store it
return update_search_query_after_search(search_query);
})
.then(function(v){
console.log("Chain is completed");
}); // Close promise chain
});
Q.allSettled(promises)
.then(function(result) {
console.log("All Promises Settled);
});