mongoose承诺和Q承诺

时间:2015-03-11 04:18:35

标签: javascript node.js mongoose promise q

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

在我们使用q promises并且使用mongoose的nodejs项目上工作我发现了一些结合这两者的不直观的hickup。

首先,mongoose承诺没有.fail.catch

另一个是Model.create返回一个promise,在解析时使用mutliple参数调用resolve函数。如果这经过Q,则Q将仅使用第一个参数调用解决方案。

请随意添加可能出现的更多问题;我将在答案中解释这些问题。

2 个答案:

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