运行以下代码段,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()
的{{1}}无法运行resolve
?
答案 0 :(得分:2)
仅当您调用resolve
回调时,承诺才会解决。如果承诺没有解决或被拒绝,则承诺将永远处于pending
状态。
Await
关键字实际上用于“等到诺言解决”,并且在您的示例中永远不会发生。
您的函数test
希望某些函数在超时过去后执行。当您将resolve
作为test
函数的参数传递时,它将在超时后被调用,promise会解决,并且您会看到控制台日志。
我不确定您要实现的结果是什么,但这是一个简短的代码段,显示了2秒sleep
函数的实现:
function sleepTwoSeconds() {
return new Promise(resolve => setTimeout(resolve, 2000))
}
async function run() {
console.log('start');
await sleepTwoSeconds();
console.log('2 seconds passed');
}
run()