Return 来自 Promise 的非返回函数导致警告

Return non-returning function from Promise results in Warning

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

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) 函数 returns 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() 函数以跳转到下一个中​​间件。它还returns undefined。有什么处理这个问题的建议吗?

But now I'm asking myself is it really waiting for the callback to finish? Is this the correct way to handle this kind of warning? I have the feeling I'm doing it wrong.

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

您的解决方法是否是处理该警告的正确方法取决于回调中发生的事情以及您的代码是否需要等待该回调中的任何异步操作实际完成。如果您的代码不需要等待它们,那么添加空的 return 就完全没问题,只是告诉 promise 库您有意不 return 使用在 [=13] 中创建的 promise =] 处理程序,在某些情况下可以这样做。

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

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

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

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