我有一个返回随机学生的异步函数。现在我想要一个能够返回两个独特学生的函数 - 这是我的问题的根源。
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()
未使用的不同承诺?
答案 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。这听起来像你想要做的。