【发布时间】:2018-08-10 07:19:51
【问题描述】:
我在 node 的 promisify() 函数中发现了一个奇怪的行为,我无法弄清楚它为什么会这样做。
考虑以下脚本:
#!/usr/bin/env node
/**
* Module dependencies.
*/
var http = require('http')
var promisify = require('util').promisify
;(async () => {
try {
// UNCOMMENT THIS, AND NODE WILL QUIT
// var f = function () { return 'Straight value' }
// var fP = promisify(f)
// await fP()
/**
* Create HTTP server.
*/
var server = http.createServer()
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(3000)
server.on('error', (e) => { console.log('Error:', e); process.exit() })
server.on('listening', () => { console.log('Listening') })
} catch (e) {
console.log('ERROR:', e)
}
})()
console.log('OUT OF THE ASYNC FUNCTION')
这是一个简单的自调用函数,用于启动节点服务器。 这很好。
现在...如果您取消注释“UNCOMMENT THIS”下的行,节点将退出而不运行服务器。
我知道我在一个不调用回调但返回一个值的函数上使用了promisify()。所以,我知道这本身就是一个问题。
但是...为什么节点只是退出...?
这真的很难调试——尤其是当你有比一个小脚本更复杂的东西时。
如果您将函数定义更改为实际调用回调的内容:
var f = function (cb) { setTimeout( () => { return cb( null, 'Straight value') }, 2000) }
一切都按预期进行......
更新
极大的简化:
function f () {
return new Promise(resolve => {
console.log('AH')
})
}
f().then(() => {
console.log('Will this happen...?')
})
只会打印“AH”!
【问题讨论】:
-
嗯,很有趣。我假设经过一段时间的空事件循环(等待永远不会解决的承诺)节点会继续前进。而且由于您没有其他任何东西在监听输入,它就像一个脚本一样,只是关闭了吗?
-
这是我的理论,但它没有解释为什么使用 适当的 回调调用函数,它可以工作!
-
@lloyd,请阅读以“我知道”开头的部分。 - 他知道
-
这个问题的重点是确定节点可能存在的问题,并且——在未来——使开发人员更容易识别这样的问题。实际上,这不应该发生。在我在节点中打开一个适当的错误之前,我想知道更广泛的 SO 社区对此有何看法(并且可能会让我自己感到尴尬!)
标签: node.js promise async-await es6-promise