生成器函数具有同步方法调用

时间:2018-05-25 17:22:26

标签: javascript ecmascript-6

您可以使用yield来进行非异步的方法调用吗?

生成器功能

function* generatorFunction () {
    var asyncResult = yield doSomethingAsync();
    console.log(asyncResult)

    var nonAsyncResult = yield doSomethingNonAsync();
    console.log(nonAsyncResult)
}

支持方法

function doSomethingAsync() {
    axios
    .get("https://jsonplaceholder.typicode.com/posts")
    .then(response => {
        generatorInstance.next(response.data);
    })
}

function doSomethingNonAsync(){
    generatorInstance.next("foo");
}

结果

首先console.log按预期工作,记录axios调用的结果,然后我得到以下javascript错误

  

未捕获(承诺)TypeError:生成器已在运行       在generatorFunction.next()       在doSomethingNonAsync(async.html:16)       在generatorFunction(async.html:23)       在generatorFunction.next()       在axios.get.then.response(async.html:11)

https://jsfiddle.net/dsquod1m/

2 个答案:

答案 0 :(得分:2)

您的问题与同步或异步调用无关。问题是你试图从发电机运行next()

var nonAsyncResult = yield doSomethingNonAsync(); // this contains another next() call

发电机不能从内部自我调用。

答案 1 :(得分:0)

我认为程序是这样的。生成器开始运行,当yield完成后的函数执行时,生成器暂停,但是调用generatorinstance.next时,生成器仍在运行,没有停止,因此引发错误。 如果yield后面带有异步函数,则在调用Generatorinstance.next时,生成器将暂停,因此效果很好。