1. 程式人生 > >es6 yield 非同步變同步

es6 yield 非同步變同步

核心是依賴 : 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);
})();