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.