Aslında, jQuery'nin Ertelenmişlerinin bir Vaat uygulaması olması gerektiği (ve jQuery3.0 aslında onları spesifik hale getirmeye çalıştığı sürece) oldukça kritik bir fark var.
Done / then arasındaki en önemli fark
.done()
HER ZAMAN, ne yaptığınıza veya ne döndürdüğünüze bakılmaksızın başladığı aynı Söz / sarılmış değerleri döndürür.
.then()
her zaman YENİ bir Promise döndürür ve bu Promise'ın neyi geri döndürdüğünüz fonksiyona bağlı olduğunu kontrol etmekle yükümlüsünüz.
JQuery'den yerel ES2015 Promises'e çevrilir, .done()
bir Promise zincirindeki bir fonksiyonun etrafına bir "dokunma" yapısı uygulamak gibi bir şeydir, çünkü zincir "çözülme" durumundaysa, bir fonksiyona bir değer iletir. ancak bu işlevin sonucu zincirin kendisini ETKİLEMEZ.
const doneWrap = fn => x => { fn(x); return x };
Promise.resolve(5)
.then(doneWrap( x => x + 1))
.then(doneWrap(console.log.bind(console)));
$.Deferred().resolve(5)
.done(x => x + 1)
.done(console.log.bind(console));
Her ikisi de 6 değil, 5'i kaydeder.
Günlük kaydı yapmak için done ve doneWrap kullandığımı unutmayın. Değil. Çünkü console.log işlevleri aslında hiçbir şey döndürmez. Ve eğer bir şey döndürmeyen bir işlevi geçerseniz ne olur?
Promise.resolve(5)
.then(doneWrap( x => x + 1))
.then(console.log.bind(console))
.then(console.log.bind(console));
Günlüğe kaydedilecek:
5
Tanımsız
Ne oldu? Ne zaman .then kullandığım ve hiçbir şey döndürmeyen bir işlevi geçtiğimde, örtük sonuç "tanımsız" ... elbette tanımsız olarak kaydedilen bir sonraki metoda bir Promde [tanımsız] döndürdü. Böylece başladığımız orijinal değer temel olarak kayboldu.
.then()
kalpte bir fonksiyon kompozisyonu biçimidir: her adımın sonucu bir sonraki adımda fonksiyonun argümanı olarak kullanılır. Bu yüzden .done en iyi şekilde bir "musluk" olarak düşünülür -> aslında kompozisyonun bir parçası değildir, sadece belirli bir adımdaki değere bir göz atar ve bu değerde bir işlevi çalıştırır, ancak aslında değişmez bileşimi herhangi bir şekilde.
Bu oldukça temel bir farktır ve yerli Vaatlerin kendilerinin bir .done yönteminin uygulanmamasının muhtemelen iyi bir nedeni vardır. Biz neden .fail yöntemi yok içine girmek zorunda değilsiniz, çünkü bu daha karmaşık (yani .fail / .catch .done / .then -> işlevlerinde çıplak değerleri döndüren aynalar DEĞİLDİR "kal" reddedilenler gibi reddedildi. daha sonra, çözüyorlar!)