es6 yield 非同步變同步
阿新 • • 發佈:2019-01-01
核心是依賴 : yield 會在執行next 的時候才才會繼續執行 將非同步變為了同步 .
非同步函式回撥中才執行 next
var fs = require("fs");
function myReadFile(name){
return function(callback){
fs.readFile(name, callback);
}
}
var myF = function*(){
var p1=yield myReadFile("a.txt");
var p2=yield myReadFile("b.txt");
console.log(p1+":"+p2);
}
var gen = myF();
// 第一次呼叫next
gen.next().value(function(err,result){
gen.next(result).value(function(err,result2){
g.next(result2);
});
});
優化以後使用co遞迴
var fs = require("fs");
function myReadFile(name){return function(callback){
fs.readFile(name, callback);
}
}
function co(generator) {
return function() {
var gen = generator();
function next(err, result) {
var step = gen.next(result);
if (!step.done) {
// 核心 next 會在非同步讀取檔案完成的時候呼叫, next 函式執行時候會開始下一次的yield 非同步呼叫,最
step.value(next);
}
}
next();
}
}
co(function*(){
var p1=yield myReadFile("a.txt");
var p2=yield myReadFile("b.txt");
console.log(p1+":"+p2);
})();