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