2015-10-15 3 views
0

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

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

  1. search_queries таблицу, которая имеет список поисковых запросов и
  2. A чириканье таблицу, которая имеет список твитов.

-поиск всех 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.

ответ

1

Ваш код может быть упрощен

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

Смотрите, если это работает для вас

+0

Большое спасибо Яро. Я думал, что Q.allSettled стреляет, прежде чем все цепочки будут завершены, но я думаю, похоже, что это менее вероятно, чем ошибка кода. – user2738707

1

Вы можете указать это в гораздо более простой способе (и менее подверженные ошибкам) ​​путем сопоставления обещаний из вашего исходного массива :

//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); 
    }); 
+0

Большое спасибо. Цепочки не заполняются для всех моих поисковых запросов. Я пытаюсь понять, если его ошибка в коде или если Q.allSettled стреляет до того, как будут выполнены цепочки обещаний. Я подозреваю, что первый. – user2738707

+0

@ user2738707 Насколько я могу судить, здесь нет ничего особенного. Почему бы не использовать простые старые [ES6 Promises] (http://www.html5rocks.com/en/tutorials/es6/promises/?redirect_from_locale=it#toc-browser-support)? – spender

+0

Поскольку я использую Angular, который использует $ q, и я все еще использую ES5 :). Этот метод вызывается, когда пользователь нажимает «поиск твиттера» для запроса, а также фоновый скрипт для автоматического поиска твиттер-запросов при возобновлении сети. – user2738707

Смежные вопросы