2016-12-26 22 views
8

Potrzebuję funkcję, która czeka, aż zmienna powstaje.Czekając aż istnieje zmienna z typeof powoduje nieskończoną pętlę

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

Wywołanie tej funkcji z przykładowym kodem poniżej powoduje nieskończoną pętlę.

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

Dlaczego?

+0

Zmienne są przekazywane przez wartość, a nie przez odniesienie, więc po prostu przekazujesz bieżącą, niezdefiniowaną wartość w 'setTimeout'. – Barmar

+2

Ty przechodząc wartość 'A', który zawsze będzie' undefined' – haim770

Odpowiedz

13

JavaScript to pass by value, więc po przejściu a do wait wystarczy podać wartość undefined.

Można spróbować przekazując funkcję do stanu oczekiwania Zamiast:

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) 
 
    } 
 
}

Można również przedłużyć ten sposób czekać na więcej niż tylko zmienna istnieje, ale gdy ma pewna wartość lub coś.

Jeśli używasz NPM i obiecuje, że to biblioteka, która robi to już: wait-until-promise. Mogą istnieć również inne, które używają klasycznych wywołań zwrotnych.

+0

sugeruję umieszczenie cała 'typeof' sprawdzić wewnątrz warunku – Bergi

+1

I sugerują, że w zdaniu po fragmencie. – 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) 
Powiązane problemy