考虑到下面的示例,我希望test
函数等待1秒(实际上是这样(,然后打印正确的消息。但是,它返回一个Promise
。
function wait (ms) {
return new Promise((resolve, reject) => {
setTimeout(() => { resolve(`Successfully waited ${ms} ms`) }, ms)
})
}
const asyncVar = wait(1000)
async function test () {
console.log('Starting test function..')
await asyncVar
console.log(`Done waiting ${asyncVar}`) // => [object Promise]
}
test()
但是,在下面的第二个代码段示例中,如果从test
函数中声明一个新变量,它将显示正确的值。
function wait (ms) {
return new Promise((resolve, reject) => {
setTimeout(() => { resolve(`Successfully waited ${ms} ms`) }, ms)
})
}
const asyncVar = wait(1000)
async function test () {
console.log('Starting test function..')
let _asyncVar = await asyncVar
console.log(`Done waiting ${_asyncVar}`) // => Successfully waited 1000 ms
}
test()
这种行为的原因是什么?
async function test () {
console.log('Starting test function..')
await asyncVar
console.log(`Done waiting ${asyncVar}`) // => [object Promise]
}
在这段代码中,${asyncVar}是一个承诺,因为您只是再次调用外部的变量";const-asyncVar=wait(1000(";,而目前这个问题还没有解决。如果你在下面写下这篇文章,你将获得想要的结果:
function wait (ms) {
return new Promise((resolve, reject) => {
setTimeout(() => { resolve(`Successfully waited ${ms} ms`) }, ms)
})
}
const asyncVar = wait(1000)
async function test () {
console.log('Starting test function..')
await asyncVar
console.log(`Done waiting ${await asyncVar}`)
}
test()
await
将保持这条线,直到承诺得到解决或拒绝。