Bunun nesi var?
Ama desen işe yarıyor!
Seni şanslı. Ne yazık ki, büyük olasılıkla bazı büyük durumu unuttuğunuz gibi, muhtemelen değil. Gördüğüm olayların yarısından fazlasında, yazar hata işleyicisiyle ilgilenmeyi unuttu:
return new Promise(function(resolve) {
getOtherPromise().then(function(result) {
resolve(result.property.example);
});
})
Diğer vaat reddedilirse, bu yeni vaadin (ele alınacağı yerde) yayılmak yerine fark edilmeyecektir - ve yeni vaat sonsuza kadar beklemektedir, bu da sızıntılara neden olabilir.
Aynı şey, geri arama kodunuzun hataya neden olması durumunda da olur - örneğin result
, a property
ve istisna atılmadığında. Bu işlenmeyecek ve yeni vaadi çözülmeyecekti.
Buna karşılık, kullanmak .then()
her iki senaryoyu da otomatik olarak halleder ve bir hata oluştuğunda yeni vaadi reddeder:
return getOtherPromise().then(function(result) {
return result.property.example;
})
Ertelenmiş antipattern sadece hantal değil, aynı zamanda hataya yatkındır . .then()
Zincirleme için kullanmak çok daha güvenlidir.
Ama her şeyi hallettim!
Gerçekten mi? İyi. Ancak, özellikle iptal veya mesaj iletme gibi diğer özellikleri destekleyen bir söz kitaplığı kullanıyorsanız, oldukça ayrıntılı ve bol olacaktır. Ya da belki gelecekte, ya da kütüphanenizi daha iyi biriyle değiştirmek mi istiyorsunuz? Bunun için kodunuzu yeniden yazmak istemezsiniz.
Kütüphanelerin yöntemleri ( then
) yalnızca tüm özellikleri yerel olarak desteklemez, aynı zamanda belirli optimizasyonlara da sahip olabilirler. Bunları kullanmak muhtemelen kodunuzu daha hızlı hale getirecek veya en azından kütüphanenin gelecekteki revizyonları ile optimize edilmesine izin verecektir.
Nasıl önleyebilirim?
Bu nedenle, manuel olarak bir Promise
veya veya Deferred
varolan vaatler söz konusu olduğunda her bulduğunuzda , önce kütüphane API'sını kontrol edin . Ertelenmiş antipattern genellikle vaatleri bir gözlemci örüntüsü olarak gören insanlar tarafından uygulanır - ancak vaatler geri çağrılardan daha fazlasıdır : kompostlanabilir olmaları gerekir. Her iyi kütüphane, uğraşmak istemediğiniz tüm düşük seviyeli şeylere dikkat ederek, vaatlerin her türlü düşünülebilir şekilde kompozisyonu için kullanımı kolay birçok fonksiyona sahiptir.
Vaat edilen bir yardımcı işlev tarafından desteklenmeyen yeni bir şekilde bazı vaatler oluşturma ihtiyacı bulduysanız, kendi işlevinizi kaçınılmaz Ertelemeler ile yazmak son seçeneğiniz olmalıdır. Daha özellikli bir kitaplığa geçmeyi ve / veya mevcut kitaplığınıza karşı bir hata vermeyi düşünün. Bakıcısı, kompozisyonu mevcut işlevlerden türetebilmeli, sizin için yeni bir yardımcı işlev uygulayabilmeli ve / veya ele alınması gereken uç durumları tanımlamaya yardımcı olmalıdır.
getStuffDone
işlev sarmalayıcısını kaldırmak ve yalnızca Promise değişmezini kullanmak olduğunu doğrulayabilir miyim ?