【问题标题】:Generator not evaluating promises生成器不评估承诺
【发布时间】:2017-10-20 09:36:00
【问题描述】:

为什么生成器不等待异步 prm 承诺完成后再继续下一个产量?

function *verify() {
    try {
        let prm = new Promise((resolve,reject) => {
            resolve("abc");
        })
        let k = yield prm
        console.log(k)
        yield 1;
        console.log("1")
        yield 2;
        console.log("2")
        yield 3;
        console.log("3")
    } catch (err) {
        console.log("error")
    }
}

var gen = verify()
while (!gen.next().done) {}

返回

undefined
1
2
3

【问题讨论】:

  • 生成器不会等待承诺。您正在考虑异步生成器,目前尚不支持,但您可以使用 Babel 进行转译。
  • 因为一个promise被认为是异步的,所以prm会被设置然后yield但它会任何时候解析,它不是阻塞的。

标签: javascript es6-promise


【解决方案1】:

因为生成器 - 就其自身而言 - 不会等待任何东西。它只是从next() 调用中发出你的yielding。你当然可以让你的循环等待,然后再调用next,当它得到一个承诺时。

你想到的是async/await。你想写

async function verify() {
    try {
        let prm = new Promise((resolve,reject) => {
            resolve("abc");
        })
        let k = await prm
        console.log(k)
        console.log("1")
        console.log("2")
        console.log("3")
    } catch (err) {
        console.log("error")
    }
}

var prm = verify();

【讨论】:

    猜你喜欢
    • 2013-06-23
    • 2016-05-12
    • 2021-10-28
    • 2016-06-22
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多