繁体   English   中英

猫鼬承诺和Q承诺

[英]mongoose promise and Q promise

[ 我会回答这个问题,但随时可以添加解决方案或其他可能发生的问题 ]

在一个我们使用q的nodejs项目上大量使用诺言和猫鼬,我发现结合了两者的一些不直观的问题。

第一个是猫鼬承诺没有.fail.catch

另一个是Model.create返回一个promise,当解析时会使用多个参数调用resolve函数。 如果经过Q,则Q将仅使用第一个参数调用解析。

请随时添加更多可能出现的问题; 我将回答如何解决这些问题。

您可以简单地使用Q函数将Mongoose的诺言转换为“合适的” Q诺言-实际上,这适用于所有可能的实现。

所以就用

Q(someMongoosePromise) .then(…).catch(…);

多个参数是一个不同的问题。 但是,有一个非常简单的技巧:将它们转换为数组并进行处理。

Q(Model.create([doc1,doc2]).then(Array)) .spread(function(d1, d2){ … });

(如果Model.create返回单个数字的承诺,则此解决方案不适用)

因为猫鼬承诺没有.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM