Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从PROMITE返回非返回函数将导致警告_Javascript_Node.js_Express_Promise_Sequelize.js - Fatal编程技术网

Javascript 从PROMITE返回非返回函数将导致警告

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

我有一个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)
函数返回
未定义的
,承诺以此警告结束
在处理程序中创建了一个承诺,但没有从处理程序中返回

我可以通过运行回调来修复此问题,然后执行如下操作
返回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)