[英]Node js, using mongoose with Q promise does not call reject function
[英]mongoose promise and Q promise
[ 我会回答这个问题,但随时可以添加解决方案或其他可能发生的问题 ]
在一个我们使用q的nodejs项目上大量使用诺言和猫鼬,我发现结合了两者的一些不直观的问题。
第一个是猫鼬承诺没有.fail
或.catch
。
另一个是Model.create返回一个promise,当解析时会使用多个参数调用resolve函数。 如果经过Q,则Q将仅使用第一个参数调用解析。
请随时添加更多可能出现的问题; 我将回答如何解决这些问题。
因为猫鼬承诺没有.catch
或.fail
( 请注意q也会从它们的库中删除它们 ),所以您不能在以.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,但是在执行qq时,仅使用一个参数调用了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];
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.