您可以使用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)
答案 0 :(得分:2)
您的问题与同步或异步调用无关。问题是你试图从发电机运行next()
:
var nonAsyncResult = yield doSomethingNonAsync(); // this contains another next() call
发电机不能从内部自我调用。
答案 1 :(得分:0)
我认为程序是这样的。生成器开始运行,当yield完成后的函数执行时,生成器暂停,但是调用generatorinstance.next
时,生成器仍在运行,没有停止,因此引发错误。
如果yield后面带有异步函数,则在调用Generatorinstance.next
时,生成器将暂停,因此效果很好。