Javascript 从PROMITE返回非返回函数将导致警告
我有一个nodejs express应用程序,我使用一个库,它有一个典型的回调接口来执行函数。我的持久层使用基于承诺的方法。我有以下困扰我的代码Javascript 从PROMITE返回非返回函数将导致警告,javascript,node.js,express,promise,sequelize.js,Javascript,Node.js,Express,Promise,Sequelize.js,我有一个nodejs express应用程序,我使用一个库,它有一个典型的回调接口来执行函数。我的持久层使用基于承诺的方法。我有以下困扰我的代码 getUserByName('dave') .then(function (user) { // check stuff and call the callback with success return cb(null, true); }) .catch((err) => cb(err, false)); 问题:c
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)
函数返回未定义的
,承诺以此警告结束在处理程序中创建了一个承诺,但没有从处理程序中返回
我可以通过运行回调来修复此问题,然后执行如下操作返回null
:
// check stuff and call the callback with success
cb(null, true);
return null;
但现在我问自己,它真的在等待回调结束吗?这是处理此类警告的正确方法吗?我觉得我做错了
我记得在编写express中间件时遇到了同样的问题,然后在承诺中调用next()
函数跳转到下一个中间件。它还返回未定义的
。对此有什么建议吗
但现在我在问自己,它真的在等待回调吗
结束?这是处理此类警告的正确方法吗?我有
感觉我做错了
node.js中的Javascript执行是单线程的,因此代码正在等待cb()
中的任何同步代码完成。如果cb()
执行异步操作(您收到的警告让我认为是),那么您的代码就不会等待这些异步操作完成
处理该警告的方法是否正确取决于回调中发生了什么,以及代码是否需要等待回调中的任何异步操作真正完成。如果您的代码不需要等待它们,那么添加空的return
是完全正确的,它只会告诉promise库您有意不返回在.then()
处理程序中创建的promise,这在某些情况下是可以的
另一方面,如果您确实需要等待回调内部的异步操作完成,那么您需要回调的帮助,以便能够通过使其返回承诺或使其本身具有完成回调来实现这一点(尽管在这种情况下,承诺会容易得多)
但现在我在问自己,它真的在等待回调吗
结束?这是处理此类警告的正确方法吗?我有
感觉我做错了
node.js中的Javascript执行是单线程的,因此代码正在等待cb()
中的任何同步代码完成。如果cb()
执行异步操作(您收到的警告让我认为是),那么您的代码就不会等待这些异步操作完成
处理该警告的方法是否正确取决于回调中发生了什么,以及代码是否需要等待回调中的任何异步操作真正完成。如果您的代码不需要等待它们,那么添加空的return
是完全正确的,它只会告诉promise库您有意不返回在.then()
处理程序中创建的promise,这在某些情况下是可以的
另一方面,如果您确实需要等待回调内部的异步操作完成,那么您需要回调的帮助,以便能够通过使其返回承诺或使其本身具有完成回调来实现这一点(尽管在这种情况下,承诺会容易得多),当然,正确的解决方案是切换到不使用节点样式回调并利用承诺的框架,这样您就可以简单地返回您的承诺,而不需要调用传递给您的任何回调
如果这是不可能的,您仍然不应该从您的普通代码调用这样的回调。警告是正确的,您调用的东西(回调)执行更多异步工作(创建其他承诺),但没有将其返回到链中(“忘记”等待),这是一个常见错误。您的显式返回null
正确地抑制了此警告,但实际上有一种更好的方法:
编写代码时,就像您已经在返回承诺一样,然后调用专用于此目的的代码(包括不发出警告):
当然,正确的解决方案是切换到不使用节点式回调并利用承诺的框架,这样您就可以简单地返回您的承诺,而不需要调用传递给您的任何回调
如果这是不可能的,您仍然不应该从您的普通代码调用这样的回调。警告是正确的,您调用的东西(回调)执行更多异步工作(创建其他承诺),但没有将其返回到链中(“忘记”等待),这是一个常见错误。您的显式返回null
正确地抑制了此警告,但实际上有一种更好的方法:
编写代码时,就像您已经在返回承诺一样,然后调用专用于此目的的代码(包括不发出警告):
尝试从回调返回cb(null,true)
。此警告显示如何创建失控承诺。感谢您的回复,但我无法控制cb返回的内容,因为它是一个外部库。例如,express中的next()
方法。尝试从回调cb(null,true)
返回null
。此警告显示如何创建失控承诺。感谢您的回复,但我无法控制cb返回的内容,因为它是一个外部库。例如,express中的next()
方法。
getUserByName('dave')
.then(function (user) {
// check stuff and call the callback with success
return true;
})
.asCallback(cb)