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) {
     }
  );
}

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

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

你可以通过瀑布:

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

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

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

尝试以下解决方案:

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

最新更新