NodeJS:如何用于异步方法的异步辅助方法

时间:2015-07-16 20:32:39

标签: node.js asynchronous

我使用Async库在NodeJS上进行异步编程。我想制作一个辅助方法(也使用异步方法),而不是将所有代码放在同一个地方。

以下是我的示例代码:

var solve = function() {
  async.waterfall([
      // a long working task. huh
      function (callback) {
          setTimeout(function() {
              console.log('hello world!');
              callback();
          }, 2000);
      },

      function (callback) {
          authorService.helperAsync();
      },

      function (callback) {
          setTimeout(function() {
              console.log('bye bye!');
          }, 2000);
      }

  ]);
};

solve();

在其他文件中,我创建了一个异步函数:

var helperAsync = function() {
    async.waterfall([
       function(callback) {
           console.log('task 1');
           callback();
       },
        function (callback) {
            console.log('task 2');
            callback();
        }
    ]);
}

我希望结果应该是:

Hello World
Task 1
Task 2
Bye Bye

但输出只是

Hello World
Task 1
Task 2

。我该如何修复我的代码?

谢谢:)

1 个答案:

答案 0 :(得分:2)

您需要将每个文件设置为module,其中包含exporting您想要返回的功能,如下所示:

<强> solve.js

var async = require('async');
var helperAsync = require('./helperAsync.js');

  module.exports = function solve() {

    async.waterfall([

        function helloOne(next) {
            setTimeout(function() {
                console.log('hello world!');
                return next();
            }, 2000);
        },

        function helperCall(next) {
            helperAsync(params, function(){
               return next();
            });
        },

        function byeBye(next) {
            setTimeout(function() {
                console.log('bye bye!');
                return next();
            }, 2000);
        }
    ], function(result){
      return result;
    });

  };

<强> helperAsync.js

var async = require('async');

module.exports = function helperAsync (params, callback) {

  async.waterfall([
      function(next) {
         console.log('task 1');
         return next();
       },
        function (next) {
          console.log('task 2');
          return next();
        }
  ], function(result){
      return callback(result);
  });

};

我已将callback中的async.waterfall重命名为next,以防止与模块的主要回调混淆。