使用嵌入式异步函数时async系列如何传递结果?

时间:2014-05-03 16:32:10

标签: node.js async.js

我知道您可以在异步系列工作器函数中使用next(错误,结果)将结果推送到最终结果数组,如下所示:

fs = require('fs');
async = require('async');

function readTheFile(next) {
    var result1 = 'something';
    next(null, result1); // <- next is executed
}
function processTheData(next) {
    var result2 = 'something else';
    next(null, result2); 
}
function processFinalResult(err, resultArray) {
    console.log(resultArray); // [ 'something', 'something else' ]
}

async.series(
    [readTheFile,
     processTheData
    ], processFinalResult
);

但是,如果您具有以下工作程序函数,result1如何被推送到最终结果数组:

// file.txt contains 'file data'

fs = require('fs');
async = require('async');

function readTheFile(next) {
    var result1 = 'something'; // <- how does this get to the final result array?
    fs.readFile('file.txt', 'utf8', next); // <- next is only passed.
}
function processTheData(next) {
    var result2 = 'something else';
    next(null, result2);
}
function processFinalResult(err, resultArray) {
    console.log(resultArray); // [ undefined ] length is 1
}

async.series(
    [readTheFile,
     processTheData
    ], processFinalResult
);

我无法调用next,因为它会立即执行它,而我只允许将函数作为回调函数传递给fs.readFile。 result1如何使它成为最终结果数组?

我不会从阅读文档或示例中找出它。

1 个答案:

答案 0 :(得分:1)

fs.readFile()&#39; s回调需要2个参数(错误和数据)如下:

fs.readFile('/etc/passwd', function (err, data) {
   if (err) throw err;
   console.log(data);
});

因此当您传入async.series()&#39; next&#39;时,fs.readFile()将其称为下一个(错误,数据),其中数据最终将处于异步&# 39; s结果数组。但是,如果您希望在传递给async的结果数组之前对数据执行某些操作,则可以执行以下操作:

function readTheFile(next) {
    var result1 = 'something';
    fs.readFile('file.txt', 'utf8', function(err, data) {
        if (err) {
            // handle error
        }
        // do some thing with data argument, such as parsing
        // or triming (data = data.trim() for example), or
        // assign it to result1 (result1 = data), then call next()
        next(err, result1);   // this will pass your result1 to async's final array
    }); 
}