【问题标题】:Detecting an update to a global var in async function在异步函数中检测对全局变量的更新
【发布时间】:2018-08-25 22:28:23
【问题描述】:

我在将变量更新到全局范围时遇到问题。我已经声明了一个变量state,然后当一个函数完成时我返回这个变量。这一切都有效。但是,我有另一个异步运行的函数,我正在等待 var 更新,但它永远不会获得更新的 state 值并无限期地循环“notReady”。我期望“返回状态”来更新全局范围内的变量,但事实并非如此。如何获取更新后的全局 state 变量以在先前触发的函数中更新?

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();

【问题讨论】:

  • typeof state === 'ready' 这永远不会是真的,因为'ready' 不是typeof 的有效值。猜你的typeof 不应该在那里?
  • 好的,谢谢。我忽略了这一点,是的,它不应该存在,但是当删除时,我仍然在其他控制台中获得旧状态,setTimeout 所在的位置,所以它仍然没有得到更新。 (编辑代码以删除 typeof)

标签: javascript jquery global-variables


【解决方案1】:

在您的 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();

顺便说一句,我真的很惊讶你能运行这段代码,因为dokeyword in JavaScript。我必须更改名称才能运行您的代码。

【讨论】:

  • 就是这样!我以为我排除了这一点。顺便说一句,do() 实际上不是我的函数的名称,但很好。
猜你喜欢
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2020-04-22
相关资源
最近更新 更多