2016-12-26 2 views
8

Мне нужна функция, которая ждет, пока не появится переменная.Ожидание, пока переменная существует с typeof, вызывает бесконечный цикл

function wait(variable, callback) { 
    if (typeof variable !== "undefined") 
     callback(); 
    else 
     setTimeout(function() { 
      wait(variable, callback); 
     }, 0) 
} 

Вызов этой функции с приведенным ниже примером кода вызывает бесконечный цикл.

var a; 
wait(a, function(){console.log('success')}); 
setTimeout(function(){a=1}, 1000) 

Почему?

+0

Переменные передаются по значению, а не по ссылке, поэтому вы просто передаете текущее неопределенное значение в свой 'setTimeout'. – Barmar

+2

Вы передаете значение 'a', которое всегда будет' undefined' – haim770

ответ

13

JavaScript: pass by value, поэтому, когда вы проходите a до wait, вы просто передаете значение undefined.

Вы можете попробовать пропускание функции для состояния ожидания вместо:

var a; 
 
console.log('started'); 
 
wait(function(){return a}, function(){console.log('success')}); 
 
setTimeout(function(){a=1}, 1000) 
 

 
function wait(condition, callback) { 
 
    if (typeof condition() !== "undefined") { 
 
     callback(); 
 
    } else { 
 
     setTimeout(function() { 
 
      wait(condition, callback); 
 
     }, 0) 
 
    } 
 
}

Вы также могли бы расширить этот метод, чтобы ждать больше, чем просто переменная существующий, но когда у него есть определенная ценность или что-то в этом роде.

Если вы используете NPM и обещания, есть библиотека, которая делает это уже: wait-until-promise. Могут быть и другие, которые также используют классические обратные вызовы.

+0

. Я предлагаю положить всю проверку 'typeof' внутри условия – Bergi

+1

. Я предлагаю это в предложении после фрагмента. – Scimonster

0
var a ; 
function wait(callback) { 
if (typeof a !== "undefined") callback(); 
else setTimeout(function() { 
     wait(callback); 
    }, 0) 
} 
wait(function(){console.log('success')}); 
setTimeout(function(){a=1},1000) 
Смежные вопросы