使用async.waterfall时,我在模块之间传递变量时遇到问题。这是我的主要参赛者。
var async = require('async');
var helpers = require('./1-helpers');
var file = process.argv[2];
var body = '';
async.waterfall([helpers.getURL, helpers.openURL, helpers.printBody]);
和函数都在此文件中
var fs = require('fs');
var http = require('http');
module.exports = {
getURL: function (done) {
fs.readFile(file, 'utf8', this.gotFileData);
},
gotFileData: function (err, url) {
if (err) return done(err);
done(null, url);
},
openURL: function (url, done) {
http.get(url, this.handleResponse).on('error', function (e) {
done(e);
});
},
handleResponse: function (res) {
res.on('data', this.readChunk);
res.on('end', function gotBody (chunk) {
done(null, body);
});
},
readChunk: function (chunk) {
body += chunk.toString();
},
printBody: function (err, body) {
if (err) return console.error(err);
console.log(body);
}
}
这是我得到的错误:
/Users/wimo/dev/nodejs/async-you/1-helpers.js:7
fs.readFile(file, 'utf8', this.gotFileData);
^
ReferenceError: file is not defined
at getURL (/Users/wimo/dev/nodejs/async-you/1-helpers.js:7:17)
at nextTask (/Users/wimo/dev/nodejs/async-you/node_modules/async/dist/async.js:5021:18)
at Object.waterfall (/Users/wimo/dev/nodejs/async-you/node_modules/async/dist/async.js:5024:9)
at Object.<anonymous> (/Users/wimo/dev/nodejs/async-you/1.js:7:7)
at Module._compile (module.js:556:32)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Module.runMain (module.js:590:10)
有关传递&#39;文件的任何提示&#39;和&#39;身体&#39;变量通过async.waterfall函数好吗?
非常感谢, 维姆
答案 0 :(得分:0)
在main.js
中在async.waterfall中传递第一个函数async.constant,这会将变量文件作为参数传递给getURL函数。请参阅Documentation of async.constant和How to pass argument to first waterfall function
async.waterfall([async.constant(file), helpers.getURL, helpers.openURL, helpers.printBody], function(err)
{ console.log(err); });
在helper.js
中var fs = require('fs');
var http = require('http');
module.exports = {
getURL: function (file, callback) {
fs.readFile(file, 'utf8', function (err, fileData) {
if (err) {
callback(err);
return;
}
callback(null, fileData);
});
},
openURL: function (url, callback) {
http.get(url, function (err, httpResponse) {
if (err) {
callback(err);
return;
}
callback(null, httpResponse);
});
},
printBody: function (httpResponse, callback) {
httpResponse.on('data', function (chunk) {
console.log(chunk);
callback(null, 'done');
});
}
}
Async.js使用回调来确定是否发生了错误,并将回调的参数传递给下一个任务。 这里,fileData,fs.readile函数的结果传递给getURL(下一个任务)。因此,url获取fileData的值。 async.waterfall documentation