2016-12-26 7 views
8

Ich brauche eine Funktion, die wartet, bis eine Variable entsteht.Wartet, bis eine Variable mit typeof existiert, verursacht eine Endlosschleife

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

Der Aufruf dieser Funktion mit dem folgenden Beispielcode verursacht eine Endlosschleife.

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

Warum?

+0

Variablen werden nach Wert übergeben, nicht als Referenz, also übergeben Sie einfach den aktuellen undefinierten Wert in Ihrem 'setTimeout'. – Barmar

+2

Sie übergeben den Wert von 'a', die immer' undefiniert' sein wird – haim770

Antwort

13

JavaScript ist pass by value, wenn Sie also a an wait übergeben, übergeben Sie einfach den Wert undefined.

Sie können versuchen, eine Funktion für die Wartebedingung vorbei statt:

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

Sie auch diese Methode erweitern könnte mehr zu warten, als nur die Variable existiert, aber für, wenn es hat ein bestimmter Wert oder etwas.

Wenn Sie NPM verwenden und verspricht, gibt es eine Bibliothek, die dies bereits tut: wait-until-promise. Es kann andere geben, die auch klassische Rückrufe verwenden.

+0

Ich würde vorschlagen, den gesamten 'typeof' Check innerhalb der Bedingung – Bergi

+1

setzen Ich schlage vor, dass in dem Satz nach dem Snippet. – 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) 
Verwandte Themen