Использование Q.allSettled для цепочки обещаний внутри цикла

Я использую большую библиотеку Q для обещаний с IndexedDB, поддерживаемых в приложении Chrome. Проблема в том, что Q.allSettled вызывается до завершения всех методов в цепочке обещаний.

У меня есть две таблицы:

  1. Таблица search_queries со списком поисковых запросов и
  2. Таблица твитов, в которой есть список твитов.

Автоматический поиск всех поисковых запросов выполняется так:

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);
    });
Другие вопросы по тегам