SORU
20 Mart 2014, PERŞEMBE


't vaatler sadece geri değil mi?

JavaScript birkaç yıldır geliştirmekte olduğum ve sözleri hakkında yaygara hiç anlamıyorum.

Tek yaptığım değişiklik gibi görünüyor:

api(function(result){
    api2(function(result2){
        api3(function(result3){
             // do work
        });
    });
});

Her neyse, bir şey gibi: async gibi bir kütüphane benim için çok iyi olabilir

api().then(function(result){
     api2().then(function(result2){
          api3().then(function(result3){
               // do work
          });
     });
});

Daha fazla kod ve daha az okunabilir. Burada bir şey elde edemedim, aniden sihirli bir şekilde 'düz' ya da değil. Sözleri şeyleri dönüştürmek zorunda bahsetmiyorum bile.

Vaatler burada hakkında büyük yaygara nedir?

CEVAP
20 Mart 2014, PERŞEMBE


Vaatler değil geri. Söz temsil ederzaman uyumsuz bir işlem gelecek sonuç. Tabii ki, onları senin gibi yazmaya, biraz parası olsun. Ama eğer onları kullanmış olması gerektiği şekilde yazarsanız, zaman uyumlu kod benzer bir şekilde zaman uyumsuz kod yazabilirsiniz ve izleyin çok daha kolay

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
});

Kesinlikle, çok daha az kod değil, ama çok daha okunabilir.

Ama bu son değil. Eğer adımlardan herhangi birini herhangi bir hata için kontrol etmek istedim Ne? hadi gerçek faydalarını keşfedin: Geri aramaları ile bunu yapmak için cehennem olurdu, ama sözler, bir parça kek

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
}).catch(function(error) {
     //handle any error that may occur before this point
});

Oldukça fazla try { ... } catch bir blok olarak aynı.

Daha iyi bile

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
}).catch(function(error) {
     //handle any error that may occur before this point
}).then(function() {
     //do something whether there was an error or not
     //like hiding an spinner if you were performing an AJAX request.
});

Ve hatta daha iyi. Eğer bu 3, *, *14apiapi2 aynı anda çalıştırabilir (onlar AJAX çağrıları vardı) ama üç beklemen gerektiği için ararsa ne? Sözler olmadan, sayaç bir tür oluşturmak için olmalıdır. Vaatlerle, ES6 gösterim kullanarak, bir parça daha kek ve çok zarif

Promise.all([api(), api2(), api3()]).then(function(result) {
    //do work. result is an array contains the values of the three fulfilled promises.
}).catch(function(error) {
    //handle the error. At least one of the promises rejected.
});

Yeni bir ışık Vaat ediyor şimdi seni görmek dileğiyle.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Washington

    Adam Washing

    12 Mayıs 2006
  • metal571

    metal571

    30 Mayıs 2006
  • Sean Murphy

    Sean Murphy

    4 ŞUBAT 2009