İlk argüman olarak hata veya hata için farklı geri çağrılar?


12

Biz (ve JS SO sohbet odası) @rlemon ile birkaç gün önce Little-XHR kütüphanesinde hata işleme hakkında bir konuşma yaptık .

Temel olarak, hangi hata işleme modelinin kullanılması gerektiğine karar vermek istedik:

xhr.get({
    // Some parameters, and then
    success: function(data) {},
    failure: function(data) {}
})

Veya:

xhr.get({
    // Some parameters, and then
    callback: function(err, data) {}
})

Biri daha jQuery benzeri, diğeri daha Düğüm benzeri. Bazıları ilk kalıbın hata işleme hakkında daha fazla düşünmenizi sağladığını söylüyor. Argüman her zaman ikinci kalıpta bulunurken, diğer geri çağrı işlevini unutabileceğiniz için, bunun tersini düşünüyorum.

Bu iki model hakkında herhangi bir görüş / avantaj / dezavantaj var mı?


xhr.get({ ... }, function (err, data) {})En azından deseni doğru
bul

Yanıtlar:


5

Asıl önemli özellik stil tutarlılığıdır, böylece aynı stilde kod yazabilir ve eşzamansız durumların nasıl işlendiği hakkında meta programlama varsayımları yapabilirsiniz.

Şahsen tercih ederim

(err, data)çünkü bu işleri halletmenin standart bir yoludur. Fonksiyon kompozisyonuna izin verir.

Örneğin after.mapbu kalıbı kullanır. Yani kod gibi

after.map(["foo.js", "bar.js"], function (fileName, callback) {
    fs.readFile(fileName, function (err, file) {
        callback(err, file)
    })
}, function (err, files) {
    // handle files
})

basitleştirilebilir

after.map(["foo.js", "bar.js", fs.readFile, function (err, files) {
    // handle files
})

Bir başka avantaj da, son parametre olarak geri arama iletebilmenizdir.

asyncOperation(options, function (err, data) {
    // not nested inside an object literal
})

Geri arama son yaklaşımı güzel bir API aşinalık yaklaşımıdır.

Diğer bir avantajı, errorişleyiciyi nesne değişmezinizde ayarlamayı veya bir tür varsayılan hata işleyicisine ayarlamayı unutabilmenizdir .

Kullanırken (err, data)size her zaman bu hata nasıl etkili bir şekilde düşünmek için hatırlatır.


2

Genel olarak, açık olanın her zaman örtük olmaktan daha iyi olduğunu hatırlamak isterim .

Bunu kullanarak, genellikle açık successve failureişlevlerle taraf olurum - bu kodu açtığınız anda tam olarak ne ile uğraştığınızı biliyorsunuz - başarı, başarılı bir şekilde biten çağrıları, hata ile ilgili çağrıları ele alır.

Alternatif, tek bir yöntem kullanarak, bu kodu değiştirmeye gittiğinizde okunması daha uzun sürer. Ayrıca, muhtemelen böyle bir şeyle sonuçlanacaksınız;

xhr.get({
    callback: function(err, data) {
        if (err) {
            // handle that error somehow
        }
        else {
            // deal with success somehow
        }
    }
})

Ve bu tür bir kazan plakası sıkıcı, hızlı bir şekilde oluyor.

Bahsetmemek gerekirse, bu kazan plakasını eklemeyi unutursanız ve örneğin, yalnızca başarıyı elde ediyorsanız, kod tabanına giren yeni bir geliştirici, onunla ilgili bir sorun görmeyebilir. Ancak açık hata / başarı geri çağrıları olması durumunda, bir errorgeri çağrıyı kaçırdığınızı ve hızlı bir şekilde geri dönüp bakmadığınızı görmeye başlayabilirler ya da en azından "iyi, bu sadece başarıyı idare eder - msgstr "hataları işlemenin bir yolunu bul". Kodun daha az büyülü görünmesini sağlar.


bir hata geri aramasının eksik olduğunu görmek daha zor ve ilk errparametreyi
işlemediğinizi

2

Ayrı geri aramalar

xhr.get()Çağrı başarılı olursa err, gereksizdir. Arama başarısız olursa. datagereksizdir. İstemci kodunu birinin veya diğerinin durumunu kontrol etmeye zorlamak yerine, her ikisini de geçmeyin.

Başarının kısmi başarıyı temsil edebileceği ortaya çıkarsa, bunu ayrı olarak belirtin. Başarısızlık genellikle kurtarma seçeneğidir.

Sadece başarı senaryosunu ele alan geliştiricilerle çalıştım ve birçok senaryoda sadece başarılı bir geri arama yapmak bu durumda yeterli olacaktır. Çok durumlu bir geri çağrı, bu programlama tarzı için başarılı olacağı için felaket bir seçenek olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.