2015-03-06 18 views
32

Anladığım kadarıyla bir çözüm çözebilir() veya reddedebilir() olabilir, ancak sözümdeki kodun bir çözüm veya reddetme çağrıldıktan sonra yürütülmeye devam ettiğini öğrendim.javascript ES6 Promises neden bir çözümden sonra yürütmeyi sürdürüyor?

Tüm anında işlev yürütülmesini durduracak olan, uyumsuz ya da geri dönüşün eş zamanlı olmayan bir sürümü olarak çözülmeyi veya reddetmeyi düşündüm. Eğer resolve bir söz hala olduğunda çağrılır

var call = function() { 
    return new Promise(function(resolve, reject) { 
     resolve(); 
     console.log("Doing more stuff, should not be visible after a resolve!"); 
    }); 
}; 

call().then(function() { 
    console.log("resolved"); 
}); 

jsbin

+5

Makul bir soru, ama sonra tekrar, JS sadece kendisine anlatmak gibi birbiri ardına deyimi yürütür: Eğer Başlatıcı fonksiyonunu çıkmak için resolve() istiyorsanız

, sen return bunu başa eklemek gerekir. 'resol()', sihirli olarak 'dönüş'ün etkisine sahip olacak bir JS kontrol ifadesi değildir, yalnızca bir işlev çağrısıdır ve evet, yürütme bundan sonra devam eder. –

+0

Bu iyi bir sorudur ve tüm yanıtları okuduktan sonra bile en iyi uygulamalardan emin değilim ... –

cevap

61

JavaScript, "run to completion" konseptine sahiptir. Bir hata atılmadıkça, return ifadesine veya sonuna ulaşılana kadar bir işlev yürütülür. Fonksiyonun dışındaki diğer kodlar buna müdahale edemez (yine bir hata atılmadıkça).

return new Promise(function(resolve, reject) { 
    return resolve(); 
    console.log("Not doing more stuff after a return statement"); 
}); 
+0

Merhaba Felix - Bence bu sadece hikayenin bir parçası - diğer kısım ise '' resol() ''in kendisi bir uyumsuzluk işlevi. Diğer (silindi) cevapta gördüğümüz gibi, bazı insanlar 'çözme 'çağrısının hemen herhangi bir geri arama yapılacağına inanmaktadır. – Alnitak

+2

@Alnitak 'resol'un kendisi eşzamansız değil, tamamen senkron. Kesinlikle ES6 API'sini kullanmasına rağmen, eşzamanlı mı, eşzamansız mı olduğu gözlenmez. – Esailija

+0

@Esailija tamam, belki de belirsizdim. Bazı insanlar, 'resol' işlevini çağırmanın, geçerli çağrı yığınının parçası olacak şekilde hemen çağrılan kayıtlı geri aramalarla sonuçlanacağına inanır. Bu doğru değil, bunun yerine sadece geri çağrıları sıraya koyar (ve haklısınız, uyumsuz değil, ama sadece bir şey yapıyor ve hemen sonlanıyor) – Alnitak

14

geri aramalar:

birisi Aşağıdaki örnek bazen çözmek çağrısından sonra console.log gösterir neden arkasında düşünceyi açıklayabilir şartnamenin eşzamansız olarak çağrılması gerekir. Bu, eşzamanlı ve eşzamansız eylemlerin bir karışımı için sözler kullanırken tutarlı davranış sağlamaktır.

nedenle geri arama sıraya, ve fonksiyon icra resolve() çağrısı aşağıdaki herhangi kodla hemen devam resolve çağırdığınızda.

Sadece JS olay döngüsü geri verildiğinde, geri arama, sıradan kaldırılabilir ve aslında çağrılabilir.

+0

Geri arama kuyruğu, A + Özellikleri'nde veya ES6'da belgeleniyor mu? – thefourtheye

+4

@thefourtheye: Olay döngüsü belirtimi, aslında [HTML5] 'in (http://www.w3.org/TR/html5/webappapis.html#event-loops) bir parçasıdır. ES6, [** '.then tarafından çağrılan [**' EnqueueJob' **] (https://people.mozilla.org/~jorendorff/es6-draft.html#sec-enqueuejob) adlı bir iç yöntemi tanımlar. '**] (https://people.mozilla.org/~jorendorff/es6-draft.html#sec-promise.prototype.then). –

+0

@FelixKling Oh teşekkürler :) – thefourtheye

İlgili konular