2017-05-20 34 views
1

为什么发电机不等待异步承诺完成前转移到下一个收益?发电机没有评估承诺

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 
+1

发电机不等待承诺。您正在考虑异步生成器,但尚未支持异步生成器,但您可以使用Babel进行传输。 – elclanrs

+1

因为承诺被认为是异步的,所以prm将被设置然后放弃,但它会解决*随时*,它不会阻塞。 – Booster2ooo

回答

1

由于发电机 - 它自己 - 不等待任何东西。它只是从next()呼叫中发出你的yield。当你得到承诺时再次致电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(); 
+0

谢谢,这完全按照预期工作 – Stanley