异步函数中的变量范围

时间:2011-08-26 14:30:29

标签: javascript

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

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

    myVariable = ...

  });
  return myVariable;
}

问题是myVariable之外和之内的asyncronousFunction是不同的变量。所以我无法从异步函数中为myVariable赋值。

如何解决此范围问题?感谢。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

它们是没有不同的变量,它是相同的变量......但是在myVariable之前你没有为return分配值功能。

此处的正确模式是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++;
});