我终于弄明白在我的代码中如何正确使用Q.all()
并且它按预期工作,但如果错误来自我的特定代码中的数据库,我不知道如何检测拒绝。我搜索了很多,但问题是,在这个特殊情况下,我无法将谷歌找到的信息与我自己的问题联系起来!现在有了代码,我有:
function username(user) {
var deferred = Q.defer();
var queryu = User.find();
queryu.where({_id: user});
queryu.exec(function(err, results) {
if (err) { //system level error
deferred.reject(err);
} else {
var nameAndFB = extractinfo(results[0]);
deferred.resolve(nameAndFB);
}
});
return deferred.promise;
}
稍后,我有另一种方法使用这个:
function masterUserObj(user, curstate) {
var p1 = username(user);
var p2 = getState(curstate);
return Q.spread([p1, p2], function(userinfo, pairstate) {
var obj1 = {};
obj1.username = userinfo[0];
obj1.fbid = userinfo[1];
obj1.idprovider = userinfo[2];
obj1.state = pairstate;
return obj1;
});
}
最后,for循环将以上所有内容用于:
function exposePairs(results, res) {
var plist = [];
for (var i = 0, m = results.length; i < m; i++) {
plist[i] = masterUserObj(results[i].user, results[i].state);
}
Q.all(plist).then(function(theArr) {
return res.jsonp({pairs: theArr});
});
}
代码有效,但我不知道在哪里以及如何最好地检测拒绝案例:deferred.reject(err);
主要是我很困惑,因为我刚刚学会了将promises与循环一起使用。
请指出最佳做法。
修改 另外,如果我应该在最终的Q.all()之后使用.done(),或者在这里没有必要,请注释代码。