javascript - Node.js:带/不带 Promise 的异步等待
问题描述
当我为我的项目设计一些需要实现的逻辑原型时,我注意到 async-await 和 Promise 的一些有趣行为。
// Notice this one returns a Promise
var callMe = function(i) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(i)
resolve(`${i} is called :)`)
}, (i+1)*1000)
})
}
// But this one doesn't
var callYou = function(i) {
setTimeout(() => {
console.log(i)
}, (i+1)*1000)
}
async function run() {
console.log("Start")
for(let i = 0; i < 3; i++) {
let val = await callYou(i)
# also try with callMe()
#let val = await callMe(i)
console.log(val)
}
console.log("End")
}
run()
,let val = await callYou(i)
结果看起来像这样
Start
callYou()
callYou()
callYou()
End
0
1
2
而使用let val = await callMe(i)
,结果看起来像这样
Start
0
0 is called :)
1
1 is called :)
2
2 is called :)
End
我期待两个函数的行为相似,因为异步函数本质上返回了一个承诺。有人可以解释为什么会这样吗?
解决方案
async
函数返回承诺,但既不是函数callYou
也不callMe
是async
函数,即使它们在哪里,callYou
也将在函数返回时实现,而不是在回调传递给setTimeout
函数时执行。
推荐阅读
- azure-devops - 如何从持续部署中排除测试项目
- sql - sql server 2017 - 如何创建唯一值并将列与这些相关联
- php - 提取外部网站的 Content-Type 并将 JSON 文件中的值保存为“Null”
- spring-boot - 是否有将 Kafka 数据发送到 AMQP/MQTT 的桥接器?
- google-sheets - 汇总 Google 表格中的合并单元格
- exchangewebservices - 更改的项目 ID 和附件 ID
- git - 如何删除前 N 个提交?
- sql - where子句和join的区别
- javascript - 下拉列表中的剑道文本框
- python - 我如何只训练新的重量?