猫鼬承诺和Q承诺



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

在一个 nodejs 项目中,我们大量使用 q 承诺和猫鼬,我发现将两者结合起来的一些不直观的小问题。

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

另一个是 Model.create 返回一个承诺,该承诺在解析时调用具有多个参数的 resolve 函数。如果这通过 Q,那么 Q 将仅使用第一个参数调用解析。

请随时添加更多可能发生的问题;我将把我是如何解决这些事情的放在答案中。

您可以简单地使用 Q 函数将猫鼬承诺投射到"适当的"Q 承诺 - 这实际上适用于每一个 thenable。

所以只需使用

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

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

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

(此解决方案不适用于Model.create返回单个数字的承诺的情况)

因为猫鼬承诺没有.catch.fail(请注意,q 也会从它们的库中删除这些),所以你不能在以 .catch 或 .fail 结尾的 q 堆栈上返回失败的猫鼬承诺,除非先将其转换为 q 承诺。以下是我是如何做到这一点的(这也在堆栈的其他地方得到了回答):

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])使用多个参数解析承诺,但是当通过q q时,仅调用一个参数的solve:

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];
});

相关内容

  • 没有找到相关文章

最新更新