节点async.waterfall在模块之间传递变量

时间:2016-09-22 02:25:20

标签: node.js asynchronous module

使用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函数好吗?

非常感谢, 维姆

1 个答案:

答案 0 :(得分:0)

在main.js

在async.waterfall中传递第一个函数async.constant,这会将变量文件作为参数传递给getURL函数。请参阅Documentation of async.constantHow 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