我想向用户发送新书的列表。到目前为止,下面的代码工作正常。问题是我不想多次发送一本书,所以我想过滤它们。多个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