Node.js nodejs-跳过未经解析的等待承诺后的语句
将跳过运行以下代码段,Node.js nodejs-跳过未经解析的等待承诺后的语句,node.js,asynchronous,promise,Node.js,Asynchronous,Promise,将跳过运行以下代码段,console.log('done'): function test (cb) { setTimeout(() => { console.log('2000ms passed') cb && cb() }, 2000) } async function run () { await new Promise((resolve, reject) => { // Doesn't run console.log('d
console.log('done')
:
function test (cb) {
setTimeout(() => {
console.log('2000ms passed')
cb && cb()
}, 2000)
}
async function run () {
await new Promise((resolve, reject) => {
// Doesn't run console.log('done') with test():
// But if test(resolve), console.log('done.') will run
test()
})
console.log('done.')
}
run()
为什么没有解析的
test()
不运行console.log('done')
?承诺只有在调用resolve
回调时才会解析。如果承诺未得到解决或拒绝,它将永远处于挂起
状态
Await
关键字实际上用于“等待承诺解决”,在您的示例中从未出现过
您的函数test
期望在超时时间过后执行某些函数。当您将resolve
作为test
函数的参数传递时,它将在超时后被调用,promise将被解析,您将看到控制台日志
我不确定您试图实现的结果是什么,但下面是一个简短的代码片段,显示了2秒睡眠
函数的实现:
函数sleepTwoSeconds(){
返回新承诺(resolve=>setTimeout(resolve,2000))
}
异步函数run(){
console.log('start');
等待睡眠两秒钟();
console.log('2秒过去');
}
run()
因为您的承诺永远处于挂起状态<代码>等待承诺将在承诺得到解决或拒绝之前停止函数执行。没有现成的超时。由于您既不调用resolve
也不调用reject
,外部函数将永远不会继续执行。@YuryTarabanko,但代码段在2秒后完成,不会被卡住。为什么程序不能永远挂在那里呢?事情是悬而未决的承诺不会创建任务。所以在事件循环中没有什么可以做的了。所以节点只是退出,但代码段在2秒后完成,没有被卡住。为什么程序不能永远挂在那里?因为在这个过程中实际上没有悬而未决的回调。