【问题标题】:Warning: a promise was created in a handler but was not returned from it警告:在处理程序中创建了一个承诺,但没有从它返回
【发布时间】:2016-04-15 22:56:32
【问题描述】:

我正在使用 bluebird 和sails 来构建我的应用程序。当我在承诺中使用数据库调用时,它会向我显示警告,如

警告:在处理程序中创建了一个承诺,但没有从 它

var P = require('bluebird');
return new P(function (resolve, reject) {
  Product.find({
    or: [
      {barcode: {'contains': q}},
      {name: {'contains': q}},
      {registrationCode: {'contains': q}}
    ]
  })
  .populate('batches')
  .exec(function (err, products) {
    if (err) return reject(err);
    return resolve(products);
  });
}); //- end promise

【问题讨论】:

标签: javascript sails.js bluebird


【解决方案1】:

//add return
return Product.find({
...
//wrapping inside bluebird promise wrapper is unnecessary here as well

...这让异步方法像同步方法一样返回值:异步方法返回的不是最终值,而是在未来某个时间点有值的承诺。

请参考documentationstandard

【讨论】:

    【解决方案2】:

    将您的代码更改为:

    return Product.find({
        or: [
          {barcode: {'contains': q}},
          {name: {'contains': q}},
          {registrationCode: {'contains': q}}
        ]
      })
      .populate('batches')
      .exec().then(function(products) {
          //  your processing here
      });
    

    .exec() 已经创建了一个 Promise,因此您可以直接返回该 Promise,而无需将其包装在另一个 Promise 中。

    您看到的警告是因为您没有对在现有 Promise 处理程序中创建的 Promise 执行任何操作。在没有看到更多代码的情况下,我们无法确定警告是由于您忽略了.exec() 返回的承诺,还是您实际上没有对该函数返回的承诺执行任何操作。

    请参阅 Bluebird 对该警告 here 的解释。这听起来很可能是您忽略了.exec() 返回的承诺。

    【讨论】:

    • 我在exec()中有一些处理,而这个函数是一个服务,会被其他方法调用。所以我应该在 exec() 中做点什么
    • @Dzanvu - .exec() 返回一个承诺。如果您正在使用 Promise,您可以在添加到从 .exec() 返回的 Promise 的 .then() 处理程序中进行处理。我在答案中的代码中添加了一个示例。
    • 你的意思是如果这个函数被称为AService.f,并且'//你的处理在这里'被替换为return {a: 1, b: 2},我可以在另一个名为@的模型动作中得到{a: 1, b: 2}的对象987654332@ 通过AService.f(paramsPassed).then(function (obj) { console.log(obj); })?结果,console.log 可以打印{a: 1, b: 2}
    猜你喜欢
    • 2017-11-02
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多