ES6中引入了generator
function* get() { var result1 = yield c; var result2 = yield b; var result3 = yield a; console.log(result1); console.log(result2); console.log(result3); return "a"; }
当调用get方法的时候,返回一个迭代器对象。var myGenerator=get();
yield关键字是用来返回迭代中的值的,每调用一次.next()方法,则返回一个yield后的值。
var one=myGenerator.next(); 返回一个object,格式为{done:false,value:c};
done标识是否迭代完成,当为true的时候则迭代完成,value为迭代出的值,此时的值为第一个yield后的值。
如果两次yield之间有代码,则是执行代码到第二次yield;
第二次调用后返回{done:false,value:b}
当第四次调用next的时候,yield a后的代码就会执行,并返回{done:false,value:"a"(如果迭代器没有返回值,则为undefined))}
对于迭代器对象可以使用for of进行迭代,即for(var item of myGenerator){};
利用迭代器可以实同步操作
function co(generator) { function next() { var part = generator.next("迭代"); if (!part.done) { part.value(next); } else { console.log("完成"); } } next(); } function a() { setTimeout(function () { console.log(1); }, 1000); return "a"; } function b(next) { setTimeout(function () { console.log(2); next(); return "b"; }, 2000); } function c(next) { setTimeout(function () { console.log(3); next(); }, 3000); return "c"; } function* get() { var result1 = yield c; var result2 = yield b; var result3 = yield a; console.log(result1); console.log(result2); console.log(result3); return "a"; } co(get());
这是参考
https://cnodejs.org/topic/53474cd19e21582e740117df这位大哥的代码后,自己更加精简的一版。