Javascript 检测异步函数中全局变量的更新

Javascript 检测异步函数中全局变量的更新,javascript,jquery,global-variables,Javascript,Jquery,Global Variables,我无法将变量更新到全局范围。我声明了一个变量状态,然后当函数完成时,我返回变量。这一切都有效。然而,我有另一个异步运行的函数,我正在等待var更新,但它永远不会得到更新后的状态值并无限期地循环“notReady”。我期望“返回状态”在全局范围内更新变量,但它没有。如何获取更新的全局状态变量以在以前激发的函数中更新 var state = 'notReady'; function do(state){ // long/heavy webGL function state = 'rea

我无法将变量更新到全局范围。我声明了一个变量状态,然后当函数完成时,我返回变量。这一切都有效。然而,我有另一个异步运行的函数,我正在等待var更新,但它永远不会得到更新后的状态值并无限期地循环“notReady”。我期望“返回状态”在全局范围内更新变量,但它没有。如何获取更新的全局状态变量以在以前激发的函数中更新

var state = 'notReady';

function do(state){
   // long/heavy webGL function
   state = 'ready'
   return state; //state successfully changes to 'ready'
};

$.when( do(state) ).then(function(state) {
    console.log(state); // this logs 'ready' successfully
    return state;
});


function previousFiredFunction(){
   function waitForState(){
      if(state === 'ready'){
         // do something when ready (this is never 'ready')
      } else {
         setTimeout(waitForState, 200); 
      }
   }
   waitForState();
}
previousFiredFunction();

do
函数中,有一个与全局变量同名的函数参数(
state
)。这会屏蔽全局变量。所有“本机”变量(例如字符串和数字)都是通过值传递的,而不是通过引用传递的

简单的修正,只是完全失去了论点。然后您将使用全局变量

var state = 'notReady';

function fndo() {
  // long/heavy webGL function
  state = 'ready'
  return state; //state successfully changes to 'ready'
};

$.when(fndo(state)).then(function (state) {
  console.log(state); // this logs 'ready' successfully
  return state;
});


function previousFiredFunction() {
  function waitForState() {
    console.log('wfs', state);
    if (state === 'ready') {
      // do something when ready (this is never 'ready')
    } else {
      setTimeout(waitForState, 200);
    }
  }
  waitForState();
}
previousFiredFunction();

顺便说一句,我真的很惊讶你居然能运行这段代码,因为
do
是一个很好的例子。我必须更改名称才能运行您的代码。

typeof state==='ready'
这永远不会是真的,因为
'ready'
不是
typeof的有效值。猜猜你的
类型不应该在那里吗?好的,谢谢。我忽略了这一点,是的,它不应该在那里,但是当被删除时,我仍然在控制台的else中获得旧状态,setTimeout在那里,所以它仍然没有得到更新。(编辑代码以删除typeof)就是这样!我想我排除了这个可能性。作为一个副词,do()实际上不是我函数的名称,而是一个很好的例子。