Bir söz içeriden nasıl reddedilir ve sonra işlev görür


86

Bu muhtemelen aptalca bir sorudur, ancak söz zincirinin ortasında, o zamanki işlevlerden birinin içinden bir sözü nasıl reddedersiniz? Örneğin:

someActionThatReturnsAPromise()
    .then(function(resource) {
        return modifyResource(resource)
    })
    .then(function(modifiedResource) {
        if (!isValid(modifiedResource)) {
            var validationError = getValidationError(modifiedResource);
            // fail promise with validationError
        }
    })
    .catch(function() {
        // oh noes
    });

Artık orijinal çözümleme / reddetme işlevine veya PromiseResolver'a bir referans yok. Sadece eklemem return Promise.reject(validationError);mi gerekiyor ?


1
throw validationError
kavun

> <Bunun aptalca / kolay bir şey olacağını hissettim. Sanırım bunun yerine özel bir reddetme işlevi çağırmam veya başarısız bir Sözü iade etmem gerektiğini düşünmeye devam ettim. Öyleyse, bir sözün / olasılığın içinden, yeni bir Söz olmayan döndürülen herhangi bir değer çözümlenmiş değer olarak kabul edilecek mi? Ve bir hata yaparsam, bu hemen reddedilen bir Sözü iade etmekle aynı şey mi? Bunu bir cevap olarak gönderirseniz, kabul ederim.
chinabuffet

Muhtemelen kabul edilen yanıtı burada arıyorsunuz stackoverflow.com/questions/17800176/…
crad

Yanıtlar:


96

Sadece eklemem return Promise.reject(validationError);mi gerekiyor ?

Evet. Ancak, yalnızca jQuery'de bu kadar karmaşıktır , Promise / A + uyumlu bir kitaplıkla,

throw validationError;

Böylece kodunuz daha sonra şöyle görünür

someActionThatReturnsAPromise()
    .then(modifyResource)
    .then(function(modifiedResource) {
        if (!isValid(modifiedResource))
            throw getValidationError(modifiedResource);
        // else !
        return modifiedResource;
    })
    .catch(function() {
        // oh noes
    });

3
Bu, yapılacak normal bir şey mi? Yaygın olarak kullanılıyor mu? Bunu yaptığım için kendimi kötü hissediyorum, çünkü kodda bir .catchyer eksikse, tüm uygulama durdurulmamış bir hatayla patlayacak ..
Andrey Popov

3
Promise / A + uyumlu bir kitaplıkta, handlerfor theneşzamanlı olduğundan ve istisnanın yakalanabildiğinden throw kullanabileceğinizi unutmayın . İşleyici eşzamansız ise, sonunda reddetmek için bir söz vermesi gerekir. Bu yüzden, atmak yerine daima Promise.reject () döndürmek bana mantıklı geliyor. Çünkü bir zaman uyumsuz işleyici atarsanız, kütüphane onu yakalayamaz ve sessizce geçer. Dikkat.
Mike Gleason jr Couturier

1
@MikeGleasonjrCouturier: Bir sözde işleyici olmayan hiçbir zaman uyumsuz işleyici olmamalıdır .then:-) Söz verilmemiş bir API kullanıyorsanız, o zaman return Promise.reject()size bile yardımcı olacaktır.
Bergi

@Bergi Şunu demek istedim: p.then(function() { doAsync(function() { throw new Error("won't catch"); }); }); DÜZENLEME: oh tamam yorumunuzu yeniden okudum, tamamen seninleyim, aynı sayfadayız ! OP'ye işaret etmek istedim :)
Mike Gleason jr Couturier

1
@MikeGleasonjrCouturier: Evet, ben de tam olarak bunu söylüyordum. Ve doAsync(function() { return Promise.reject(new Error("won't catch, won't throw")); })orada da çalışmıyor - sadece sessizce başarısız oluyor. doAsync().then(function() { throw new Error("will be caught"); })Sözlerle çalışırken gerçekten olmalı .
Bergi
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.