[我会回答这个问题,但随时可以添加解决方案或其他可能出现的问题]
在我们使用q promises并且使用mongoose的nodejs项目上工作我发现了一些结合这两者的不直观的hickup。
首先,mongoose承诺没有.fail
或.catch
。
另一个是Model.create返回一个promise,在解析时使用mutliple参数调用resolve函数。如果这经过Q,则Q将仅使用第一个参数调用解决方案。
请随意添加可能出现的更多问题;我将在答案中解释这些问题。
答案 0 :(得分:3)
您可以简单地使用Q
function将Mongoose承诺转换为“正确的”Q承诺 - 这实际上适用于每个人。
所以只需使用
Q(someMongoosePromise) .then(…).catch(…);
Multiple arguments是一个不同的问题。但是,有一个非常简单的hack:将它们转换为数组并使用它。
Q(Model.create([doc1,doc2]).then(Array)) .spread(function(d1, d2){ … });
(此解决方案不适用于Model.create
返回单个号码的承诺的情况)
答案 1 :(得分:0)
因为猫鼬承诺没有.catch
或.fail
(请注意,q会将这些内容从库中移除),因此您无法返回失败的mongoose承诺以.catch或.fail结尾的aq堆栈,而不是先将其转换为aq承诺。这是我如何做到的(这已经在堆栈的其他地方得到了答案):
function something(){
return q()//make sure this function returns a promise instead of an unhandled error
.then(function(){
//do some stuff
})
.then(function(){
return someMongoosePromise
.then(function resolve(res){//make sure to return a q promise if this function is called in a stack that has
//.then.then.then(function(){return something();}).fail(...
return q.resolve(res);
},function reject(err){
return q.reject(err);
}
);
});
}
我遇到的第二个问题是Model.create([doc1,doc2])用多个参数解析了promise但是当经过q q时,只用一个参数调用resolve:
q()
.then(function(){
return Model.create([doc1,doc2]);
})
.then(function(docs){
docs===doc1;//David Copperfield took doc2
});
解决方案与第一个解决方案大致相同:
q()
.then(function(){
return Model.create([doc1,doc2])
.then(function(){//let mongoose resolve the promise
var ret=[],i=arguments.length;
while(--i>-1){
ret.push(arguments[i];
}
return q.resolve(ret);
});
})
.then(function(docs){
docs===[doc1,doc2];
});