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这位大哥的代码后,自己更加精简的一版。