2015-07-04 17 views
6

Neden anlayamıyorum Promise delay .then() argüman çağrısı?Neden Promise.resolve(). Sonra() gecikmeli?

örnek:

var myPromise = Promise.resolve(); 
console.log(myPromise); 
myPromise.then(()=>console.log('a')); 
console.log('b'); 

konsol dönüş: yerine getirilir

> Promise { <state>: "fulfilled", <value>: undefined } 
> "b" 
> "a" 

myPromise, neden .then() imediatly çağrı işlevi çözmek değil mi?

cevap

6

Belirtime göre, vaatler, çözüm işleyicilerini, geçerli yürütme iş parçacığı çözülmeden ve "platform kodu" na geri döndükten sonra çağırdığından. Bu, her zaman asenkronize olarak adlandırıldığını garanti eder.

Bu nedenle, ilk olarak yürütme iş parçacığı bittiğinde ve daha sonra çözüm işleyici, console.log('a')'u gördüğünüz yerde çağrılırken, console.log('b')'u görürsünüz. Promises/A+ specification kaynaktan

:

2.2.4

onFulfilled veya yürütme bağlam yığını tek platform kodu içeren kadar onRejected adı edilmemelidir. [3.1]. İşte

“platformu kodu” motor, çevre anlamına gelir ve uygulama kodunu söz:

Ve burada not [3,1] bu. Pratikte, bu gereksinim, onFulfilled ve onRejected'in, daha sonra çağrıldığı ve daha sonra yeni bir yığınla çağrıldığı olay döngüsünden sonra eşzamansız olarak yürütülmesini sağlar. Bu, setTimeout veya setImmediate gibi bir “makro görev” mekanizmasıyla veya MutationObserver veya process.nextTick gibi bir “micro-task” mekanizmasıyla uygulanan olabilir. Sözkonusu uygulama, platform kodu olarak kabul edildiğinden, kendisinin işleyicilerin çağrıldığı bir görev zamanlama kuyruğu veya “trampoline” içerebilir.

Bu söz (senkronize olan veya olmayan) çözüldüğünde tutarlı yürütme düzeni öylesine olursa olsun sağlamak için yapılır, then() işleyicileri her zaman diğer koda aynı zamanlama göreli olarak adlandırılır. Birçok sözün eşzamansız olarak çözüldüğü için, nasıl çözüldüğüne bakılmaksızın belirli bir sözü tutarlı hale getirmenin tek yolu, her zaman .then() işleyicisini zaman uyumsuz olarak çağırmaktır.

5

jfriend00'un cevabı doğrudur. Nedenini açıklamama izin ver. Diyelim ki bir yerden myPromise aldım. Bilmiyorum sadece Promise.resolve, ,, zaman uyumsuz olarak çözebilir ve olmayabilir.

myPromise.then(function(){ 
    console.log("a"); 
}); 
console.log("b"); 

Eşzamansızlık garanti olmasaydı - o olur bazen günlüğüne a b ve bazen b a. Bu bir yarış durumudur ve terrible thing to have'dur.Sözler, bu soruna tasarımdan etkilenmez ve özellikle yeni vaatler uygulamalarında ve yerel vaatlerde garanti edilen idam emri her zaman garanti edilir.

Yeni işlerin çalıştırılmasının gerçek uygulaması via Job Queues. then, işleyicideki iş kuyruğuna bir iş belirtir ve kod hazırlandıktan sonra iş kuyrukları çalıştırılır - bu, here belirtilir.

İlgili konular