【问题标题】:Node.js: async-await with/without PromiseNode.js:带/不带 Promise 的异步等待
【发布时间】:2019-10-02 01:28:03
【问题描述】:

当我为我的项目设计一些需要实现的逻辑原型时,我注意到 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

我期待两个函数的行为相似,因为异步函数本质上返回一个承诺。有人能解释一下为什么会这样吗?

【问题讨论】:

  • 你在使用new 运算符吗?
  • 哎呀,这是一个错字。我的坏
  • [...] since async function essentially returns a promise.[...] 这是什么意思?唯一带有async 关键字的函数是runcallYou 既不是 async 也不是返回 Promise。

标签: javascript node.js async-await


【解决方案1】:

async 函数返回承诺,但 callYoucallMe 都不是 async 函数,即使它们在哪里,callYou 将在函数返回时实现,而不是在回调传递给 setTimeout 函数时被执行。

【讨论】:

  • 啊,有道理。 callMe() 返回一个 Promise,所以我猜循环是在等待 callMe() 中的 Promise 在执行下一个 callMe() 之前解决。谢谢
猜你喜欢
  • 1970-01-01
  • 2020-03-24
  • 2017-03-13
  • 2020-03-04
  • 2019-01-13
  • 2019-07-21
  • 2021-03-26
  • 1970-01-01
  • 2014-01-25
相关资源
最近更新 更多