node q promise递归

时间:2014-02-21 21:56:54

标签: javascript node.js asynchronous q

我有一个返回随机学生的异步函数。现在我想要一个能够返回两个独特学生的函数 - 这是我的问题的根源。

    getTwoRandom = function(req) {
        var deferred = Q.defer();

        Q.all([
            Student.getRandom(req), 
            Student.getRandom(req)
            ])
        .then(function(students){
            if(students[0]._id !== students[1]._id) { //check unique
                deferred.resolve(students);
            } else {
                //students are the same so try again... this breaks
                return getTwoRandom(req);
            }
        });

        return deferred.promise;
    };

然后再往下我有这样的事情:

getTwoRandom(req).then(function(students) {
     //do what I want...
});

问题是,当我return getTwoRandom(req);执行.then()函数时,行不会触发......这是否会返回.then()未使用的不同承诺?

1 个答案:

答案 0 :(得分:2)

你过分复杂了一点:)

你可以这样做:

getTwoRandom = function(req) {
    return Q.all([
        Student.getRandom(req), 
        Student.getRandom(req)
    ]).then(function(students) {
        if(students[0]._id !== students[1]._id) {
            return students;
        } else {
            return getTwoRandom(req);
        }
    });
};

现在,为什么这样做? Q.all的结果始终是一个新的承诺(无需创建新的延迟)。无论你返回什么价值(ike students)都将包含在这个新的承诺中。如果返回实际的promise(如getTwoRandom(req)),则返回该promise。这听起来像你想要做的。