用co 哪里写的有问题
发布于 7 年前 作者 wtcsy 3051 次浏览 来自 问答

下面是代码 就是想按顺序的方式读取下文件内容… 哪里错了 ps 各位用什么来处理异步的了?

var co = require(‘co’); var fs = require(“fs”);

function readFile(filename) { return function(callback) { fs.readFile(filename, ‘utf8’, function(err,data){ callback({ err : err, data : data }) }); }; }

co(function* () { var file1 = yield readFile(’./txt/1.txt’); var file2 = yield readFile(’./txt/2.txt’); console.log(file1); console.log(file2); return ‘done’; })

5 回复

你的引号用的中文

yield 后面跟的方法,要返回的是一个promise, 。用bluebird模块。

var co           = require('co');
var fs           = require('fs');

function readFile(filename) {
    return function(callback) {
        fs.readFile(filename, 'utf8', callback);
    };
}

co(function* () {
    var file1 = yield readFile('./txt/1.txt');
    var file2 = yield readFile('./txt/2.txt');

    console.log(file1);
    console.log(file2);
    return 'done';
})

readFile 回调函数不是你这么写的,要遵守 Node.js的Error-first回调模式!

  1. 回调函数的第一个参数保留给一个错误error对象,如果有错误发生,错误将通过第一个参数err返回。
  2. 回调函数的第二个参数为成功响应的数据保留,如果没有错误发生,err将被设置为null, 成功的数据将从第二个参数返回。

所以

function readFile(filename) {
    return function(callback) {
        fs.readFile(filename, 'utf8', function(err, data){
			if(err){
				return callback(err);
			}
			
			return callback(null, data);
		});
    };
}

这样可以简写成:

function readFile(filename) {
    return function(callback) {
        fs.readFile(filename, 'utf8', callback);
    };
}

@wenjie88

co 模块后面可以是一个function。

/**
 * Convert a `yield`ed value into a promise.
 *
 * @param {Mixed} obj
 * @return {Promise}
 * @api private
 */

function toPromise(obj) {
  if (!obj) return obj;
  if (isPromise(obj)) return obj;
  if (isGeneratorFunction(obj) || isGenerator(obj)) return co.call(this, obj);
  if ('function' == typeof obj) return thunkToPromise.call(this, obj);
  if (Array.isArray(obj)) return arrayToPromise.call(this, obj);
  if (isObject(obj)) return objectToPromise.call(this, obj);
  return obj;
}

在co源码中可以把 function,Array,Object等转化为Promise对象~

我还想把几个参数合并成一个对象了
想当然了 多谢各位!~

回到顶部