2016-04-13 16 views
4

Hızlı bir şekilde şu soru soruldu: JavaScript Promise asenkron? Ben Promise ve async programlama (ajax istekleri) üzerinde bir çok yazı okuyorum. Promise, uyumsuz değilse, bunu nasıl yaparız? Örneğin, f işlevini args argüman dizisiyle Promise içine sarmak için bir işlevim var. f ile ilgili hiçbir şey doğal olarak async'tır. JavaScript Promise asenkronize midir?

function getPromise(f, args) { 
return new Promise(function(resolve, reject) { 
    var result = f.apply(undefined, args); 
    resolve(result); 
}); 
} 

Bazı SO mesajları okumak ve setTimeout birçok insan kod olmayan engelleme yapmak için tavsiye ne olduğuna karar, bu uyumsuz yapmak için.
function getPromise(f, args) { 
return new Promise(function(resolve, reject) { 
    setTimeout(function() { 
    var r = f.apply(undefined, args); 
    resolve(r); 
    }, 0); 
}); 
} 

setTimeout çalışma ile bu yaklaşım kodu Promise içindeki engellenmeyen yapmak istiyorsunuz?

(tarayıcılar tarafından desteklenmektedir sadece ne, herhangi bir üçüncü taraf Promise API dayanarak değilim unutmayın).

+0

https: //developer.mozilla.org/tr/docs/Web/JavaScript/Başvuru/Global_Objects/Promise –

+0

olası bir kopyası [JavaScript Promise Callback Asynchronously yürütülüyor] (http://stackoverflow.com/q/29963129/1048572) – Bergi

cevap

9

Sana bir yanlış anlama altında çalıştıklarını düşünüyorum. JavaScript kodu engelleme daima * olduğu; çünkü tek bir iş parçacığı üzerinde çalışır. Javascript'te asenkron kodlama stilinin avantajları, G/Ç gibi harici işlemlerin bu iş parçacığının engellenmesini gerektirmemesidir. G/Ç'den gelen yanıtı işleyen geri arama hala engelleniyor ve başka bir JavaScript aynı anda çalışamıyor.

* Eğer (bir tarayıcı bağlamında veya WebWorkers) birden fazla işlem çalışmaktadır düşünün sürece. özel sorular için Şimdi

:

açıklama Sadece hızlı bir soru: JavaScript Promise asenkron nedir?

böyle bir zaman aşımı gibi bir asenkron görevi başlatmak veya bir dosyaya yazma ve o asenkron görev önce tamamladığını kadar beklemek kesinlikle mümkün olsa

Hayır, Promise yapıcı geçirilen geri arama derhal ve eşzamanlı yürütülen sözü çözme; Aslında bu sözlerin birincil kullanım vakasıdır.

Bu, setTimeout işinde bir sözün içinde kodun engellenmesini engellemek için işe yarar mı?

Hayır, öyle her yürütme sırasını değiştirmek olduğunu. Komut dosyanızın geri kalanı tamamlanana kadar yürütülür ve daha sonra başka bir şey olmadığında setTimeout için geri arama gerçekleştirilir. Açıklık getirmek için

:

console.log('a'); 

new Promise(function () { 
    console.log('b'); 
    setTimeout(function () { 
     console.log('D'); 
    }, 0); 
}); 

// Other synchronous stuff, that possibly takes a very long time to process 

console.log('c'); 

Yukarıdaki program deterministik yazdırır:

ana iş parçacığı şey bırakması gerektiğini sonrasına kadar setTimeout için geri arama (çalıştırmaz çünkü
a 
b 
c 
D 

'c' kaydı.

+0

Şimdi biraz daha iyi anlıyorum. Sanırım (geriye doğru bükülüp WebWorker'larını tanımam sürece), 'Promise' kullanarak kodumu engellemeyen veya aysnc yapmaz. Temel olarak, 'Promise' kullanmaya devam edeceğim çünkü en azından şimdi iç içe geçmiş geri çağırma işlemine sahip değilim. Teşekkürler. –