我想向用戶發送新書的列表。到目前爲止,下面的代碼工作正常。問題是我不想多次發送一本書,所以我想過濾它們。多個Q.all內部函數?
當前的代碼工作正常:
function checkActiveBooks(books) {
var queue = _(books).map(function(book) {
var deferred = Q.defer();
// Get all alerts on given keywords
request('http://localhost:5000/books?l=0&q=' + book.name, function(error, response, body) {
if (error) {
deferred.reject(error);
}
var books = JSON.parse(body);
if (!_.isEmpty(books)) {
// Loop through users of current book.
var userBooks = _(book.users).map(function(user) {
// Save object for this user with name and deals.
return {
user: user,
book: book.name,
books: books
}
});
if (_.isEmpty(userBooks)) {
deferred.resolve(null);
} else {
deferred.resolve(userBooks);
}
} else {
deferred.resolve(null);
}
});
return deferred.promise;
});
return Q.all(queue);
}
但現在我想已經過濾發書:
function checkActiveBooks(books) {
var queue = _(books).map(function(book) {
var deferred = Q.defer();
// Get all alerts on given keywords
request('http://localhost:5000/books?l=0&q=' + book.name, function(error, response, body) {
if (error) {
deferred.reject(error);
}
var books = JSON.parse(body);
if (!_.isEmpty(books)) {
// Loop through users of current book.
var userBooks = _(book.users).map(function(user) {
var defer = Q.defer();
var userBook = user.userBook.dataValues;
// Check per given UserBook which books are already sent to the user by mail
checkSentBooks(userBook).then(function(sentBooks) {
// Filter books which are already sent.
var leftBooks = _.reject(books, function(obj) {
return sentBooks.indexOf(obj.id) > -1;
});
// Save object for this user with name and deals.
var result = {
user: user,
book: book.name,
books: leftBooks
}
return deferred.resolve(result);
});
return Q.all(userBooks);
} else {
deferred.resolve(null);
}
});
return deferred.promise;
});
return Q.all(queue);
}
但上面的代碼不起作用。它不停止循環。我認爲使用q.all兩次是有意義的,因爲它包含兩個循環。但我想我做錯了...
你說的「它不會停止循環」是什麼意思? – Bergi 2014-08-29 11:33:14
我看到的唯一問題是'checkSentBooks'可能在所有'checkActiveBooks'' request()'完成之前被調用。您的服務器上是否存在競爭狀況,這些競爭情況取決於對方? – Bergi 2014-08-29 11:34:43
那麼它確實停止循環,但我沒有返回一個響應,我的不好。但checkSentBook是異步的這一事實是一個問題。它也包含一個承諾,因爲checkSentBook使用Sequelize JS來調用數據庫。這就是我有兩個q.all的原因。我現在的問題是,.map函數不會等待checkSentBook函數返回數據庫結果,因此數組中的書對象保持爲空。雙重q.all不起作用。檢查本傑明的答案,並回答下面的答案。 – 2014-08-29 11:36:45