Anasayfa » Kodlama » JavaScript Sözlerine Başlarken

    JavaScript Sözlerine Başlarken

    Zaman uyumsuz kod olan görevleri gerçekleştirmek için kullanışlıdır zaman tükeniyor ama tabi ki eksilerden yoksun değil. Zaman uyumsuz kod kullanıyor geri arama işlevleri sonuçlarını işlemek için ancak geri arama işlevi değerleri döndüremiyorum bu tipik JavaScript işlevlerinin yapabildiğini.

    Böylece, yalnızca kontrol etme yeteneğimizi ellerinden almazlar. işlevin yürütülmesi ama aynı zamanda yapmak hata işleme biraz güçlük. İşte burası Söz vermek nesne gelir, bazılarını doldurmayı amaçlar gibi asenkron kodlamada çukurlar.

    Söz vermek teknik olarak bir standart iç nesne JavaScript’te anlamı geliyor JavaScript’e yerleşik. Temsil etmek için kullanılır zaman uyumsuz bir kod bloğu sonucu (veya kodun başarısız olmasının nedeni) ve zaman uyumsuz kodun yürütülmesi.

    Sözdizimi

    Yaratabiliriz bir örneği Söz vermek nesne kullanmak yeni anahtar kelime:

     Yeni Söz (işlev (çözümle, reddet)) ); 

    İşlev parametre olarak geçti -e Söz vermek() yapıcı olarak bilinir vasiyet hükümlerini gerçekleştiren erkek. Zaman uyumsuz kodu tutar ve iki parametresi vardır fonksiyon tip, olarak anılır çözmek ve reddetmek fonksiyonlar (bunlara kısaca daha fazlası).

    Devletler Söz vermek nesne

    başlangıç ​​hali bir Söz vermek nesne denir kadar. Bu durumda, zaman uyumsuz hesaplamanın sonucu mevcut değil.

    İlk bekleyen durum olarak değişir yerine hesaplama olduğunda durumu başarılı. hesaplamanın sonucu bu durumda mevcut.

    Asenkron hesaplama durumunda başarısız, Söz vermek nesneye taşınır reddedilen başlangıçtan itibaren durum kadar belirtmek, bildirmek. Bu durumda, hesaplama başarısızlığının nedeni (yani, hata mesajı) kullanıma sunuldu.

    Gitmek için kadar için yerine belirtmek, bildirmek, çözmek() denir. Gitmek için kadar için reddedilen belirtmek, bildirmek, ) (Reddetme denir.

    sonra ve yakalamak yöntemleri

    Ne zaman devlet dan değişiklik kadar için yerine, olay işleyicisi Söz vermek nesne en sonra yöntem Idam edildi. Ve ne zaman devlet dan değişiklik kadar için reddedilen, olay işleyicisi Söz vermek nesne en yakalamak yöntem Idam edildi.

    örnek 1

    “Sigara Promisified” kod

    Bir varsayalım ki hello.txt içeren dosyayı “Merhaba” sözcüğü. Bir AJAX isteğini şu şekilde yazabiliriz o dosyayı al ve içeriğini göster, kullanmadan Söz vermek nesne:

     işlevi getTxt () let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType (metin / düz '); xhr.send (); xhr.onload = function () try anahtar (this.status) vaka 200: document.write (this.response); break; durum 404: 'Dosya Bulunamadı' fırlat; default: throw 'Dosya alınamadı';  catch (err) console.log (err);  getTxt (); 

    Dosyanın içeriği varsa başarıyla alındı, yani. cevap durum kodu 200, cevap metni belgeye yazılmış. Eğer dosya bulunamadı (durum 404), bir “Dosya bulunamadı” hata mesajı atıldı. Aksi takdirde, bir genel hata mesajı dosyanın alınmadığını gösterir..

    “Promisified” kod

    Şimdi hadi Yukarıdaki kodu söz ver:

     function getTxt () return yeni Promise (function (çöz, reddet)) let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.send (); xhr.onload = function () switch (this.status) vaka 200: solve (this.response); vaka 404: reddet ('Dosya Bulunamadı'); dosyayı al ');;);  getTxt (). sonra (function (txt) document.write (txt);). catch (function (err) console.log (err);); 

    getTxt () fonksiyon şimdi kodlanmıştır yeni bir örneğini döndür Söz vermek nesne, ve yürütme işlevi, asenkron kodu öncekilerden tutar..

    Ne zaman cevap durum kodu 200, Söz vermek olduğu yerine tarafından çağrı çözmek() (yanıt, parametresi olarak iletilir. çözmek()). Durum kodu 404 veya başka bir Söz vermek olduğu reddedilen kullanma ) (Reddetme (parametresi olarak uygun hata mesajı ile ) (Reddetme).

    etkinlik işleyicileri sonra() ve yakalamak() yöntemleri arasında Söz vermek nesne sonunda eklendi.

    Ne zaman Söz vermek olduğu yerine, işleyicisi sonra() yöntem çalıştırıldı. Onun argümanı parametre iletildi çözmek(). Olay işleyicisinin içinde, yanıt metni (bağımsız değişken olarak alınan) belgeye yazılmış.

    Ne zaman Söz vermek olduğu reddedilen, olay işleyicisi yakalamak() yöntem çalıştırıldı, hatayı günlüğe kaydetme.

    ana avantaj Yukarıda belirtilen Kodlanan versiyonun açıklaması hata işleme. Etrafında Tutulmamış İstisnalar atmak yerine - Sözde Olmayan versiyondaki gibi - uygun hata mesajları iade edilir ve kaydedilir.

    Ama bu sadece dönen arasında başarısızlık mesajları aynı zamanda asenkron hesaplamanın sonucu bu bizim için gerçekten avantajlı olabilir. Bunu görmek için örneğimizi genişletmemiz gerekecek.

    Örnek 2

    “Sigara Promisified” kod

    Yerine sadece metni görüntülemek hello.txt, İstiyorum ile birleştirmek “Dünya” sözcük ve ekranda göster 2 saniyelik bir zaman aşımından sonra. İşte kullandığım kod:

     işlevi getTxt () let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType (metin / düz '); xhr.send (); xhr.onload = function () try anahtar (this.status) vaka 200: document.write (concatTxt (this.response)); break; durum 404: 'Dosya Bulunamadı' fırlat; default: throw 'Dosya alınamadı';  catch (err) console.log (err);  işlev concatTxt (res) setTimeout (function () return (res + 'Dünya'), 2000);  getTxt (); 

    Durum kodu 200’de concatTxt () fonksiyon denir Yanıt metnini “Dünya” sözcük belgeye yazmadan önce.

    Ancak bu kod istenildiği gibi çalışmayacak. setTimeout () geri çağırma işlevi birleştirilmiş dizgeyi döndüremiyorum. Belgeye ne basılacak Tanımsız çünkü bu ne concatTxt () döner.

    “Promisified” kod

    Yani, kodu çalıştırmak için, hadi Yukarıdaki kodu söz ver, dahil olmak üzere concatTxt ():

     function getTxt () return yeni Promise (function (çöz, reddet)) let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () switch (this.status) case 200: solve (this.response); case 404: reddet ('Dosya Bulunamadı'); default: reddet ('Başarısız Oldu dosyayı al ');;);  function concatTxt (txt) return new Promise (function (çözümle, reddet)) setTimeout (function () solve (txt + 'World');, 2000););  getTxt (). sonra ((txt) => return concatTxt (txt);). sonra ((txt) => document.write (txt);). catch ((err) => konsol. log (err);); 

    Sadece gibi getTxt (), concatTxt () ayrıca işlev yeni bir sonuç verir Söz vermek nesne birleştirilmiş metin yerine Söz vermek tarafından geri döndü concatTxt () olduğu geri arama işlevi içinde çözüldü setTimeout ().

    Yukarıdaki kodun sonuna yakın, ilk olay işleyicisi sonra() yöntem ne zaman çalışır? Söz vermek arasında getTxt () olduğu yerine, yani dosya olduğunda başarıyla alındı. Bu işleyicinin içinde, concatTxt () denir ve Söz vermek tarafından geri döndü concatTxt () Iade edildi.

    İkinci olay işleyicisi sonra() yöntem ne zaman çalışır? Söz vermek tarafından geri döndü concatTxt () olduğu yerine, yani iki saniye zaman aşımı sona ermiştir ve çözmek() denir birleştirilmiş dizgenin parametresi olarak.

    En sonunda, yakalamak() tüm istisnaları ve başarısızlık mesajlarını yakalar Her iki sözden de.

    Bu Promisified versiyonunda, “Selam Dünya” dize olacak başarıyla yazdırıldı belgeye.