如何等待readFile()返回结果之后再执行?

Gear
  • 99
var fs =require('fs')
var co = require('co');

function readfile(path){
    fs.readFile(path,'utf8',(err,data)=>{
        if(err) console.log(err); 
        return data;
    });
}


var gen =function* (){
    
    var f1=yield readfile('/home/kevin/nodeSrc/testSrc/file/a.js');
    var f2=yield readfile('/home/kevin/nodeSrc/testSrc/file/b.js');
    console.log(f1.toString());
    console.log(f2.toString());
};



co(gen).then(function(){
    console.log('111');
});

上面的代码应读取的文件都在,但就是没有返回结果,所以有几个疑惑,请教各位
1.为何不报错?
2.lz单拿readfile()方法实验执行得到的原因是因为readFile()本身就是异步的,所以f1的值是undefined,但那也应该能继续往下执行啊,怎么没有一点打印信息?
3.如何更改才能读取显示打印信息呢?

lz初学,还请各位指点

回复
阅读 3.8k
5 个回答

1、为何不报错。就算readFile有错,也是一个异步错误,你这边也是拿不到的。
2、你没有将生成器使用正确。
3、yield接受一个Promise对象,所以改法如下:

function readfile(path) {
  return new Promise((resolve, reject) => {
    fs.readFile(path, 'utf8', (err, data) => {
      if (err) {
        console.log(err);
        reject(err);
      }
      resolve(data);
    });
  });
}

我记得co只能执行generate function或者Promise吧,如果按你这么写的话,readfile应该是返回一个Promise实例才对。

在co中,yield后面只能是Thunk或者Promise。

把你的readfile该写成返回Promise的函数。

宣传栏