2014-07-24 38 views
17

Sadece setTimeout'tan getiri değeri almak istiyorum, ancak aldığım işlevin tüm metin formatı mı?Geri dönüş değeri setTimeout'dan alın

function x() { 
    setTimeout(y = function() { 
     return 'done'; 
    }, 1000); 
    return y; 
} 

console.log(x()); 
+0

yapılması ya da değil, sadece işlev döndürecek bilmek oluştu sonra hiç

var y="notdone"; setTimeout(function() { y="done"; }, 1000); 

Sen değişken y erişebilirler. – Mritunjay

+0

"bitti" mi iade edilmek istiyorsun? 1000 ms sonra çağrılacak fonksiyonun sonucunu nasıl iade edebilirsiniz? –

+0

Zaman aşımları zaman uyumsuzdur, bu yüzden onlardan geri dönemezsiniz. (iyi, yapabilirsin, ama geri dönüş değeri hiçbir yere gitmiyor) – Ferdi265

cevap

29

Bunun için Promises kullanmanız gerekir. Onlar available in ES6 ama quite easily polyfilled edilebilir:

function x() { 
    var promise = new Promise(function(resolve, reject) { 
    window.setTimeout(function() { 
     resolve('done!'); 
    }); 
    }); 
    return promise; 
} 

x().then(function(done) { 
    console.log(done); // --> 'done!' 
}); 
+0

aslında benim örneğimde "done" bir setTimeout içinde döndürülmesi gereken bir vaatti çünkü setTimeout içinde döndürülen deferred.resolve() değerini alamıyorum. Nasıl olurdu? Teşekkürler – Vainglory07

+1

Sorunuzda kodunuzun daha açık bir örneğini yayınlayabilir misiniz? –

4

Sen setTimeout geçmek işlevinden dönüş değeri elde edilemez.

setTimeout (örneğinizde x) adlı işlev, setTimeout'a ilettiğiniz işlev çağrılmadan önce yürütmeyi ve geri dönmeyi sonlandırır.

Aldığınız değerle ne yapmak isterseniz, setTimeout'a ilettiğiniz işlevden yapmanız gerekir.

function x() { 
    setTimeout(function() { 
     console.log("done"); 
    }, 1000); 
} 

x(); 
+0

Güzel ve hassas açıklama! –

1

Daha fonksiyonu x ve ne olursa olsun görevi olduğunu geri dönüşünde göndermek o zaman aşımı sonra gerçekleştirmek istediğiniz bir geri arama almak: En örnekte

, bu kadar yazılır olacaktır.

function x (callback) { 
    setTimeout(function() { 
     callback("done"); 
    }, 1000); 
} 

x(console.log.bind(console)); //this is special case of console.log 
x(alert) 
0

Sana hiçbir oluştu veya olayı bilmek bayrağı var istediğini düşünüyorum. setTimeout bir değer döndürmez. Eğer olay meydana algılamak için bir değişken kullanabilir veya zaman aşımı Sözdiziminizin böyledir