理解Node.JS使用async.waterfall如何执行外部函数

jae*_*hin 6 javascript asynchronous waterfall node.js

我需要使用async.js模块执行异步函数.但是当我执行外部函数时,我遇到了一些问题.

代码传递得很好.

但是当我将全局变量更改为局部变量时,我无法使用参数进行设置.

var async = require('async');
var ogs = require('open-graph-scraper');

// global variables
var param1 = {url: 'http://www.google.com/'};
var param2 = {url: 'https://www.yahoo.com/'};

function function1(callback){
    ogs(param1, function(error, data1) {
        callback(null, data1);
    });
} 
function function2(data1, callback){
    ogs(param2, function(error, data2) {
        callback(null, data1, data2);
    });
}
function function3(data1, data2, callback){
    console.log(data1);
    console.log("---------------");
    console.log(data2);
}

(function temp() {
    async.waterfall([function1, function2, function3],
        function(err, result){
            console.log(result);
            console.log(err);
            if(err) console.log(err);
        }
    );
})();
Run Code Online (Sandbox Code Playgroud)

如果param1和param2改为局部变量,就像这样..

(function temp() {
    var param1 = {url: 'http://www.google.com/'};
    var param2 = {url: 'https://www.yahoo.com/'};
    async.waterfall([function1, function2, function3],
        function(err, result){
            console.log(result);
            console.log(err);
            if(err) console.log(err);
        }
    );
})();
Run Code Online (Sandbox Code Playgroud)

如何在function1()或function2()中使用"param"

我无法改变本地的功能类型

async.waterfall([
    function(callback){
    },
    function(data,callback){
    }],
    function(err){
    if(err) console.log(err);
    }
);
Run Code Online (Sandbox Code Playgroud)

Pau*_*aul 0

所以我通常做的就是设置一种“引导”函数作为我的瀑布中的第一个函数,它接收参数并启动将它们向前传递的链。

function start(params){
  params = params || {}; // make sure you have at least an empty object here
  return function(callback){
     // do something
     callback(null, params); // error is always the first cb param for most things
  }
}

function second(params, callback){
   // do something else. Maybe extend the params object
   params.newProp = "foo";
   callback(null, params);
}

// later, maybe in another module

async.waterfall([
  start({foo : 'bar'}),
  second
],
  function result(e, res){
    // handle result 
  });
Run Code Online (Sandbox Code Playgroud)