2015-08-24 23 views
22

jQuery Deferred ürününü Promise ürününe dönüştürmek doğru yolu bu mu?jQuery Ertelenmiş nesne bir ES6 Sözüne dönüştürülüyor

var p = Promise.resolve($.getJSON('api/values', null)); 

Bunu yapmak için başka yollar var mı?

Sınırlamalar nelerdir? JQuery ertelemesinin istisnaları desteklemediğini bir yere okudum, bu yüzden bir ertelenmiş bir vaatin ne olacağını da kabul ediyorum. Bu doğru mu?

+0

, bunun istisnaları destek vereceğini düşünürdüm. Bir sözün içindeki kod hem senkron hem de asenkron olabilir. –

cevap

5

olması gerektiği Evet, Promise.resolve() API destekleri argüman olarak seçilebilir. Yani bir jquery erteleme nesnesi geçiyor sadece iyi çalışır. Eğer bir ES6 vaadi ile ertelenmiş Nesne kaydırma,

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve#Resolving_thenables_and_throwing_Errors

+2

Bunun yalnızca ilk jQuery ajax parametresiyle ilgiliyse işe yaradığını aklınızda bulundurun; yani, eğer .then (function, dataStatus, jqXhr) {}) 'i istiyorsanız, bu işe yaramaz. Sözler sadece tek bir argümanı destekliyor. JQuery '' sözünü '' yeni bir Söze (...) 'dönüştürmek ve oradaki argümanları mareşal etmek zorundasınız. – nicodemus13

7

Bunun işe yarayıp yaramadığından emin değilim. Ben öneriyoruz: Ben kompozisyon tercih ediyorum

var toPromise = function ($promise) { 
    return new Promise(function (resolve, reject) { 
    $promise.then(resolve, reject); 
    }); 
}); 

var p = toPromise($.getJSON('api/values', null)); 
+0

Bunu yapmanın ve jQuery'den tamamen kurtulmanın bir yolu var mı? Bir mobil uygulama için jquery.min.js eklenmesi ek yükünü ortadan kaldırmak hoş olacaktır. –

+1

['Promise' constructor antipattern] 'i (http://stackoverflow.com/q/23803743/1048572) kullanın ve sadece' Promise kullanın .resolve'! – Bergi

2

:

var p = new Promise(function (resolve, reject) { 
    $.getJSON('api/values', null) 
    .then(resolve, reject); 
}); 

tercihen aşağıdaki gibi bir adaptorfunction yaratabilecek

const successCb1 =()=>$.getJSON('api/values'), 
successCb2 = (json)=>alert(json), 
errorCb = (e)=>alert(e); 
Promise 
    .resolve() 
    .then(successCb1) 
    .then(successCb2) 
    .catch(errorCb);