Q.all 运行 forEach 之前
Q.all running before forEach
我正在尝试创建一个读取电子邮件数组的 promise 函数,然后找到用户 ID 并将其推送到另一个数组。
问题是我的 Q.all
函数在 _.forEach
完成之前是 运行。看看:
var deferred = Q.defer(),
promises = [],
_ = require('lodash');
_.forEach(users, function(user) {
User.findOne({
username: user
}, function(err, member) {
if (err)
console.log(err);
var memberId = member._id;
promises.push(members.push(memberId));
});
});
Q.all(promises)
.then(function(promises) {
deferred.resolve(promises);
console.log(promises); // This always returns -> []
})
.catch(function(err) {
deferred.reject(err);
});
return deferred.promise;
所以每次我尝试 console.log
我的承诺数组时,我得到一个空数组。我什至尝试使用 JavaScript 原生 forEach
功能,但它没有用。
是 forEach
问题还是 Q.all
不是适合这种情况的函数?
提前致谢。
已解决(Robert Moskal建议的解决方案)
就我而言,async
库和 Q.defer()
一起解决了问题。
var async = require('async'),
deferred = Q.defer();
async.map(users, function(each, done){
User.findOne({
username: each
}, function(err, member) {
if (err)
console.log(err);
done(null, member._id);
});
}, function(err, results){
if (err)
deferred.reject(err);
deferred.resolve(results);
});
return deferred.promise;
您的问题是 User.findOne 函数是异步的,因此 Q.all 函数在任何内容被推送到 promise 数组之前执行。
通常最好不要混用回调和承诺。至于修复它。如果那是猫鼬模型,那么您可以使用基于 promise 的 findOne 版本:
var deferred = Q.defer(),
promises = [],
_ = require('lodash');
_.forEach(users, function(user) {
promises.push(User.findOne({
username: user}));
});
Q.all(promises)
.then(function(promises) {
deferred.resolve(promises);
console.log(promises); // This always returns -> []
})
.catch(function(err) {
deferred.reject(err);
});
return deferred.promise;
或者您可以使用看起来像这样的异步库:
async.map(users, function(each, done){
User.findOne({
username: user
}, function(err, member) {
if (err)
console.log(err);
done(null, member._id);
});
},
function(err, results){
//results holds your array of ids
}
);
我正在尝试创建一个读取电子邮件数组的 promise 函数,然后找到用户 ID 并将其推送到另一个数组。
问题是我的 Q.all
函数在 _.forEach
完成之前是 运行。看看:
var deferred = Q.defer(),
promises = [],
_ = require('lodash');
_.forEach(users, function(user) {
User.findOne({
username: user
}, function(err, member) {
if (err)
console.log(err);
var memberId = member._id;
promises.push(members.push(memberId));
});
});
Q.all(promises)
.then(function(promises) {
deferred.resolve(promises);
console.log(promises); // This always returns -> []
})
.catch(function(err) {
deferred.reject(err);
});
return deferred.promise;
所以每次我尝试 console.log
我的承诺数组时,我得到一个空数组。我什至尝试使用 JavaScript 原生 forEach
功能,但它没有用。
是 forEach
问题还是 Q.all
不是适合这种情况的函数?
提前致谢。
已解决(Robert Moskal建议的解决方案)
就我而言,async
库和 Q.defer()
一起解决了问题。
var async = require('async'),
deferred = Q.defer();
async.map(users, function(each, done){
User.findOne({
username: each
}, function(err, member) {
if (err)
console.log(err);
done(null, member._id);
});
}, function(err, results){
if (err)
deferred.reject(err);
deferred.resolve(results);
});
return deferred.promise;
您的问题是 User.findOne 函数是异步的,因此 Q.all 函数在任何内容被推送到 promise 数组之前执行。
通常最好不要混用回调和承诺。至于修复它。如果那是猫鼬模型,那么您可以使用基于 promise 的 findOne 版本:
var deferred = Q.defer(),
promises = [],
_ = require('lodash');
_.forEach(users, function(user) {
promises.push(User.findOne({
username: user}));
});
Q.all(promises)
.then(function(promises) {
deferred.resolve(promises);
console.log(promises); // This always returns -> []
})
.catch(function(err) {
deferred.reject(err);
});
return deferred.promise;
或者您可以使用看起来像这样的异步库:
async.map(users, function(each, done){
User.findOne({
username: user
}, function(err, member) {
if (err)
console.log(err);
done(null, member._id);
});
},
function(err, results){
//results holds your array of ids
}
);