2016-12-26 31 views
8

Bir değişken varlık haline gelene kadar bekler bir işlev gerekir neden olur. Örnek kodu ile bu işlevi çağırmakdeğişken typeof ile var ulaşılmasını beklemek sonsuz döngü

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

altında sonsuz bir döngü neden olur.

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

Neden?

+0

Değişkenler, referans ile değil, değere göre geçirilir, bu yüzden 'setTimeout'unuzdaki mevcut, tanımsız değeri geçiyorsunuz. – Barmar

+2

Hep olacak a' 'değerini, geçiyoruz' – haim770

cevap

13

JavaScript pass by value, yani wait için a geçtiğinde, sadece değerini undefined geçmektedir.

yerine bekleme durumu için bir işlev geçirmeden deneyebilirsiniz: ama olduğunda için, ayrıca mevcut sadece değişken daha beklemek için bu yöntemi genişletmek olabilir

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

belli bir değer ya da bir şey. Eğer UÖM'yi ve sözler kullanırsanız

, zaten bunu yapar bir kütüphane var: wait-until-promise. yanı klasik geri aramalar kullanma Başkaları da olabilir.

+0

undefined' ben bütün koyarak öneririm 'koşulu – Bergi

+1

içini kontrol typeof' Bana göre, eğer snippet'inden sonra cümlede. – 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)