【问题标题】:Return non-returning function from Promise results in Warning从 Promise 返回非返回函数导致警告
【发布时间】:2016-08-14 06:54:47
【问题描述】:

我有一个 nodejs express 应用程序,我使用了一个库,它有一个典型的回调接口来执行函数。我的持久层使用基于 Promise 的方法。我有以下代码困扰我

getUserByName('dave')
  .then(function (user) {
    // check stuff and call the callback with success
    return cb(null, true);
  })
  .catch((err) => cb(err, false));

问题:cb(null, true) 函数返回 undefined 并且承诺以警告 a promise was created in a handler but was not returned from it 结束。

我可以通过运行回调来解决这个问题,然后像这样执行return null

    // check stuff and call the callback with success
    cb(null, true);
    return null;

但现在我问自己真的是在等待回调完成吗?这是处理这种警告的正确方法吗?我觉得我做错了。

我记得在编写 express 中间件时遇到同样的问题,然后在调用 next() 函数的 promise 中跳转到下一个中​​间件。它还返回undefined。有什么建议可以解决这个问题吗?

【问题讨论】:

  • 尝试从回调 cb(null, true) 返回 null。此警告显示创建失控的承诺。 more info
  • 感谢您的回复,但我无法控制 cb 返回的内容,因为它是一个外部库。例如 express 中的next() 方法。

标签: javascript node.js express promise sequelize.js


【解决方案1】:

但现在我在问自己是不是真的在等待回调 结束?这是处理这种警告的正确方法吗?我有 感觉我做错了。

node.js 中的 Javascript 执行是单线程的,因此代码正在等待 cb() 中的任何同步代码完成。如果cb() 执行异步操作(您收到的警告让我认为是),那么您的代码不会等待这些异步操作完成。

您的解决方法是否是处理该警告的正确方法取决于回调中发生的情况以及您的代码是否需要等待该回调中的任何异步操作实际完成。如果您的代码不需要等待它们,那么添加空的 return 就可以了,并且只是告诉承诺库您故意不返回在 .then() 处理程序中创建的承诺,这是一件好事在某些情况下这样做。

另一方面,如果您确实需要等待回调内部的异步操作完成,那么您需要回调的帮助,以便能够通过使其返回或返回承诺来做到这一点自己有一个完成回调(尽管在这种情况下承诺会容易得多)。

【讨论】:

    【解决方案2】:

    好吧,正确的解决方案当然是切换到不使用节点样式回调并利用 Promise 的框架,这样您就可以简单地 return 您的 Promise 并且不需要调用任何传递的回调给你。

    如果这不可能,您仍然不应该从您的正常代码中调用此类回调。警告是正确的,您正在调用执行更多异步工作(创建其他承诺)但没有将其返回到您的链(“忘记”等待它)的东西(回调),这是一个常见的错误。你明确的return null 正确地抑制了这个警告,但实际上有一个更好的方法:
    编写您的代码,就好像您已经返回了 Promise,然后调用专用于此目的的 .asCallback(包括不发出警告):

    getUserByName('dave')
      .then(function (user) {
        // check stuff and call the callback with success
        return true;
      })
      .asCallback(cb)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-09
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      相关资源
      最近更新 更多