【问题标题】:variable scope in asynchronous function异步函数中的变量范围
【发布时间】:2011-08-26 22:35:09
【问题描述】:

我已经构建了返回一些变量的函数。但是我的函数异步使用了另一个函数。

function getVariable() {
  var myVariable;
  asyncronousFunction(function(...){

    myVariable = ...

  });
  return myVariable;
}

问题在于myVariable 外部和asyncronousFunction 内部是不同的变量。所以我不能通过异步函数为myVariable赋值。

如何解决这个范围问题?谢谢。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    它们是相同的变量,但您不能从getVariable 函数同步异步函数调用的结果returnmyVariable 的值将在稍后某个未指定的时间点异步更新。但是您的函数正在返回值 now。这行不通。

    这意味着您的 getVariable 函数也是异步的,这意味着您必须以这种方式设计它。例如,它可以接受回调,就像asyncronousFunction 一样。

    【讨论】:

      【解决方案2】:

      它们是不同变量,它是同一个变量...但在函数结束时return 之前,您没有为myVariable 赋值。

      这里的正确模式是getVariableasychronousFunction 接受回调,这些回调在asynchronousFunction 完成执行时执行。

      function getVariable(callback) {
        var myVariable;
        asyncronousFunction(function(/* pass callback as one of the parameters */){
      
          myVariable = ...
      
        });
      
        // Don't return myVariable, as it's useless at this point
      };
      
      function asyncronousFunction(callback) {
         // This simulates the asynchronous call. When the call finishes, invoke callback and pass the result as a parameter.
         setTimeout(function () {
              callback("result");
         }, 1000);
      }
      

      然后你应该编辑你如何使用函数getVariable()

      那么你可能有过:

      var value = getVariable();
      // do whatever with value
      value++;
      

      你现在应该有:

      getVariable(function (value) { // value is now passed as a parameter
          value++;
      });
      

      【讨论】:

        猜你喜欢
        • 2019-08-21
        • 2015-09-20
        • 2017-02-10
        • 2011-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多