如何在查询mongoose时捕获Q.all()上的拒绝?

时间:2015-03-19 18:58:10

标签: promise q meanjs

我终于弄明白在我的代码中如何正确使用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(),或者在这里没有必要,请注释代码。

0 个答案:

没有答案