【发布时间】:2019-08-08 10:09:55
【问题描述】:
我正在编写一些代码来模拟我只想进行一次的数据库调用,并将结果存储在地图中(以防止重复往返)。
我的代码似乎工作正常,但我得到了一个意想不到的结果:当我删除一个等待值(在下面突出显示)时,代码似乎在等待承诺的解决(因为 console.log 仍然等待 5 秒),但记录的值仍然是 Promise。
在我看来,这似乎不一致,所以我认为我对 Promise 的理解可能有所欠缺。
const inputs = ['a', 'b'];
let promiseOrValue
async function processor(input){
if (promiseOrValue){
await promiseOrValue
}
else {
promiseOrValue = asyncFunction()
await promiseOrValue
}
console.log(`${input} ${**await** promiseOrValue}`)
}
async function asyncFunction(){
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('resolving')
resolve('foo')
}, 1000)
})
}
inputs.forEach(processor)
我希望console.log 将立即打印[object Promise],或者等待5 秒并打印foo。事实上,它等待 5 秒,然后打印 [object Promise]。
【问题讨论】:
-
无论如何,您正在执行
await promiseOrValue的更高功能,所以这就是您在任何一种情况下都在等待的原因。 -
一个 Promise 对象只是承诺你会在未来的某个时候得到一个值。如果您不打算等待该值,那么您当然会得到承诺而不是值。
-
.forEach()不会在其回调中暂停await。因此,您的.forEach()循环会立即运行到完成,这似乎不太可能是您想要的。这段代码看起来很混乱。如果您备份并更准确地描述您要完成的工作,您可能会在一个好的设计方面获得更好的帮助。您是否只是尝试为最近检索的值构建数据库缓存,以便可以从缓存中获取最近检索的值?
标签: javascript promise async-await