Обнаружение обновления глобальной переменной в асинхронной функции - PullRequest
0 голосов
/ 26 августа 2018

У меня проблемы с обновлением переменной в глобальной области видимости. Я объявил переменную состояние , затем, когда функция завершена, я возвращаю переменную. Это все работает. Однако у меня есть другая функция, выполняющаяся асинхронно, где я ожидаю обновления переменной var, но она никогда не получает обновленное значение state и циклически изменяет notReady. Я ожидал, что «return state» обновит переменную в глобальной области видимости, но это не так. Как я могу получить обновленную глобальную переменную 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();

1 Ответ

0 голосов
/ 26 августа 2018

В вашей функции 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 - это ключевое слово в JavaScript . Мне пришлось изменить имя, чтобы даже запустить ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...