SORU
19 Mart 2014, ÇARŞAMBA


Nasıl sözler için varolan bir geri bir API dönüştürebilirim?

Sözleri ile çalışmak istiyorum ama nasıl bir biçimde geri bir API var:

1. DOM yük ya da başka bir olay:

window.onload; // set to callback
...
window.onload = function(){

};

2. Düz geri arama:

function request(onChangeHandler){
...
request(function(){
    // change happened
});

3. ("") Nodeback: . düğüm stili geri

function getStuff(dat,callback){
...
getStuff("dataParam",function(err,data){

}

4. Düğüm tarzı geri: bütün bir kütüphane

API;
API.one(function(err,data){
    API.two(function(err,data2){
        API.three(function(err,data3){

        })
    });
});

Nasıl sözler, nasıl yaparım, API""? promisify ile çalışırım

CEVAP
19 Mart 2014, ÇARŞAMBA


Sözler devlet olarak bekleyen başlarlar ve yerleşmek

  • yerine getirmiştirişlem başarıyla tamamlandı yani.
  • reddettihesaplama başarısız oldu yani.

Döndüren fonksiyonlar sözhiç atmak gerekir, reddi yerine dönmelidir. Söz fonksiyonu geri atıyor hem kullanmaya zorlar } catch {ve21**. İnsanlar promisified API kullanarak atmak için sözler beklemeyin. Ne zaman uyumsuz JS iş eminsen değil - lütfen 49* *ilk.

1. DOM yük ya da başka bir olay:

Bu yüzden, genellikle onlar yerine veya red aşamaya geçmek anlamına gelir verileri kullanılabilir olduğunu göstermek için yerleşmek belirtirken anlamına gelir vaat oluşturma (ve .then ile erişilebilir).

Modern yerel ES6 sözler gibi: Promise kurucu destekleyecek uygulamalar söz

function load(){
    return new Promise(function(resolve,reject){
         window.onload = resolve;
    });
}

Kitaplıkları ile destek ertelenmiş (hadi bu örnek için q kullanın $, ama aynı zamanda bir WordPress kullanmak daha sonra kullanacağız):

function load(){
    var d = $q.defer();
    window.onload = function(){ d.resolve(); };
    return d.promise;
}

Ya da API gibi bir WordPress kullanmak ile, bir olay bir kez oluyor takma:

function done(){
    var d = $.Deferred();
    $("#myObject").once("click",function(){
         d.resolve();
    });
    return d.promise();
}

2. Düz geri arama:

Bu API yaygın madem... geri JS yaygın değildir. Hadi onSuccess onFail yaygın durumda bak:

 function getUserData(userId, onLoad, onFail){ ...

Modern yerel ES6 sözler gibi: Promise kurucu destekleyecek uygulamalar söz

function getUserDataAsync(userId){
    return new Promise(function(resolve,reject){
         getUserData(userId,resolve,reject);
    });
}

Kitaplıkları ile destek ertelenmiş (bu örneğin bir WordPress kullanmak burada kullanalım, ama aynı zamanda kullanılan $q yukarıda yazdık):

function getUserDataAsync(userId){
    var d = $.Deferred();
    getUserData(userId,function(res){ d.resolve(res); } ,function(err){ d.reject(err); });
    return d.promise();
}

jQuery de şöyle: bizi çok yakından new Promise(fn) form öykünen bir ifade yazmak için izin avantajı olan $.Deferred(fn) bir form sunuyor

function getUserDataAsync(userId) {
    return $.Deferred(function(dfrd) {
        getUserData(userId, dfrd.resolve, dfrd.reject);
    }).promise();
}

Not: Burada ertelenmiş resolve reject jQuery bir yöntem olduğu gerçeğini istismar ediyoruz""; ıe. sökülebilir bu bağlıdırlarörnekbir jQuery.() Ertelenmiş. Tüm libs bu özelliği sunuyoruz.

3. ("") Nodeback: . düğüm stili geri

Düğüm tarzı geri (nodebacks) geri aramalar her zaman son argüman alır ve ilk parametre bir hata olduğu belli bir biçime sahip. Hadi ilk promisify bir el ile:

getStuff("dataParam",function(err,data){

İçin:

function getStuffAsync(param){
    return new Promise(function(resolve,reject){
         getStuff(param,function(err,data){
             if(err !== null) return reject(err);
             resolve(data);
         });
    });
}

Deferreds ile aşağıdaki (hadi Q şimdi tercih etmelisiniz yeni sözdizimini destekler, ancak bu örnek için Q kullanın) yapabilirsiniz:

function getStuffAsync(param){
    var d = Q.defer();
    getStuff(param,function(err,data){
         if(err !== null) return d.reject(err); // `throw err` also works here.
             d.resolve(data);
    });
    return d.promise;   
}

Genel olarak, elle şeyler çok fazla promisify değil, en akılda Düğümü ile tasarlanmış kütüphaneler promisifying nodebacks için yerleşik bir yöntem var söz veriyorum. Örneğin

var getStuffAsync = Promise.promisify(getStuff); // Bluebird
var getStuffAsync = Q.denodeify(getStuff); // Q

4. Düğüm tarzı geri: bütün bir kütüphane

Altın kural burada yok, onları tek tek promisify. Ancak, bazı söz ve uygulamalar, Bluebird, örneğin toplu olarak bunu yapmak, API Basit olarak: bir söz nodeback bir API dönüştürme için izin verir

Promise.promisifyAll(API);

Notlar:

  • .then işleyici zaman tabii ki, işler promisify gerekmez. .then işleyici bir söz iade veya söz değeri ile gidermek reddeder. .then bir işleyici atmak da iyi bir uygulama olduğunu ve söz reddeder - bu ünlü sözü güvenliği atmak.
  • onload gerçek bir durumda addEventListener yerine onX kullanmalısınız.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BurnedInDotCom

    BurnedInDotC

    3 NİSAN 2010
  • guau . .

    guau . .

    25 Ocak 2008
  • Microsoft Research

    Microsoft Re

    24 EKİM 2008