Nodejs asyn.apply 和 Javascript 申请

Nodejs asyn.apply and Javascript Apply

有人能解释一下为什么下面的代码打印 "arg1 0" 而我期望它打印 "arg1 hi" 吗?是词法作用域的问题吗?

runIt();

function localScoped(arg1, callback) {
  console.log('arg1', arg1);
  callback();
}

function runIt() {

   var myValue = 0;
   async.eachLimit(["hi"], 1,
      function launchOneVar(clientCode, doneLaunchOneVar) {

          async.waterfall([
              function (myCallback) {
                  myValue = clientCode;
                  myCallback();
              },
              async.apply(localScoped, myValue)
          ], function (err, result) {
              console.log(myValue);
              doneLaunchOneVar(null, result);
          });
      },
     function finishing(err) {
     }
  );

}

尝试以下解决方案:

runIt();

function localScoped(arg1, callback) {
  console.log('arg1', arg1);
  callback();
}

function runIt() {
   var myValue = 0;
   async.eachLimit(["hi"], 1,
      function launchOneVar(clientCode, doneLaunchOneVar) {
        //console.log(clientCode);
          async.waterfall([

              function (myCallback) {
                  myValue = clientCode;
                  myCallback(null , myValue);
              },
              async.apply(localScoped)

          ], function (err, result) {
              console.log('last - '+myValue);
              doneLaunchOneVar(null, result);
          });
      },
     function finishing(err) {
     }
  );
}

瀑布的工作原理: .

运行一系列异步任务,将每个任务的结果传递给下一个任务。

连续运行一组函数,每个函数将其结果传递给数组中的下一个。但是,如果任何函数将错误传递给回调,则不会执行下一个函数并立即调用主回调并返回错误。

更多详情请看:https://www.npmjs.com/package/async-waterfall

瀑布只是一个函数。
这里没有任何魔法。
Javascript 中的任何函数都必须在调用前评估其参数。

因此,async.apply(localScoped, myValue)async.waterfall 之前求值并关闭旧 myValue 的值 (0);

你可以通过瀑布:

function (myCallback) {
  myValue = clientCode;
  myCallback(null , myValue);
},
async.apply(localScoped);

或者写一个包装函数,比如:

function(next) {
  localScoped(myValue, next);
}