ES6的新语法,并不直接执行逻辑,而是生成一个对象--迭代器,通过调用这个对象的next()方法,来一步步向后走。执行完一个yield关键字就会停止,等待下一次next()调用。
funtion* myLogin(){ yield 2; yield 5; }
var it = myLogin();
it.next(); // 2
it.next(); // 5
function myAjax(){ return fetch(‘https://img.alicdn.com/imgextra/i4/745475881/O1CN01VtOOnR1tJXl7Cnmcy_!!745475881.png‘); } function genRunner(genFunc){ return new Promise(function(resolved, rejected){ var it = genFunc(); var innerRunner = function (data) { var val = it.next(data) if (val.done) { resolved(val.value) return } if (val.value) { val.value.then(data => { innerRunner(data) }) }else{ innerRunner(val.value) } } innerRunner(); } )}; genRunner(function*() { // generator函数中发起异步请求 var serverData = yield myAjax(); console.log(‘MyLogic after myAjax‘); console.log(‘serverStatus:%s‘,serverData.status); }).then(function (message) { console.log(message) })
在以上代码中,执行genRunner函数,生成器作为参数传入。genRunner函数中首先调用生成器得到迭代器it,然后调用innerRunner方法。第一次调用时,执行至生成器yield关键字结束,即发起了一个ajax请求,返回了一个promise对象。在innerRunner中,val.value就是这个promise对象,通过.then执行next(),将响应结果传到生成器中,就拿到了最后的状态码。此时innerRunner中的val为{value:undefined, done:true},执行最后的resolved函数,value为undefined,因此输出undefined
原文:https://www.cnblogs.com/ashen1999/p/12715741.html