【问题标题】:Nodejs asyn.apply and Javascript ApplyNodejs async.apply 和 Javascript Apply
【发布时间】:2015-11-09 03:29:36
【问题描述】:

谁能解释一下为什么下面的代码打印“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)myValue的值仍然是0,因为它会在myValue = clientCode;之前被调用,将你的代码async.apply移动到function (myCallback) {块中
  • async.apply 处于瀑布流中。在第一个函数完成之前不能调用它。这就是为什么我问它与词法范围有关。请给我更多的细节?我可以重写代码来解决问题,但我想知道内部原理。
  • 看我的回答,用async.apply(localScoped)代替async.apply(localScoped, myValue)
  • 您的 apply 在瀑布开始运行之前使用旧的 myValue 创建一个闭包。

标签: javascript node.js lexical-scope


【解决方案1】:

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

所以,async.apply(localScoped, myValue)async.waterfall 之前进行评估并关闭旧 myValue 的值 (0);

你可以穿过瀑布:

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

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

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

【讨论】:

    【解决方案2】:

    尝试以下解决方案:

    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

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多