Öyleyse eğer başka bir sözle nasıl başa çıkılır?


87

Bazı durumlarda, bir vaat nesnesinden bir dönüş değeri aldığımda then(), değerin durumuna bağlı olarak iki farklı öncelik başlatmam gerekir , örneğin:

promise().then(function(value){
    if(//true) {
        // do something
    } else {
        // do something 
    }
})

Düşünüyorum da belki şöyle yazabilirim:

promise().then(function(value){
    if(//true) {
        // call a new function which will return a new promise object
        ifTruePromise().then();
    } else {
        ifFalsePromise().then();
    }
})

ama bununla iki sorum var:

  1. Yeni bir söz başlatmanın iyi bir fikir olduğundan emin değilim - o zaman bir sözle süreci;

  2. ya iki işlemin sonuncusunda bir işlevi çağırmasına ihtiyacım olursa? Aynı "terminal" e sahip oldukları anlamına gelir

Orijinal zinciri korumak için yeni sözümü geri vermeye çalıştım:

promise().then(function(value){
    if(//true) {
        // call a new function which will return a new promise object
        // and return it
        return ifTruePromise();
    } else {
        // do something, no new promise
        // hope to stop the then chain
    }
}).then(// I can handle the result of ifTruePromise here now);

ama bu durumda, ister doğru ister yanlış olsun, bir sonraki thenişe yarar.

Öyleyse, bunun üstesinden gelmek için en iyi uygulama nedir?


Yanıtlar:


61

İşlevleriniz bir söz verdiği sürece, önerdiğiniz ilk yöntemi kullanabilirsiniz.

Aşağıdaki keman, ilk çözümlenen değerin ne olacağına bağlı olarak nasıl farklı zincirleme yollarını izleyebileceğinizi gösterir.

function myPromiseFunction() {
	//Change the resolved value to take a different path
    return Promise.resolve(true);
}

function conditionalChaining(value) {
    if (value) {
        //do something
        return doSomething().then(doSomethingMore).then(doEvenSomethingMore);
    } else {
        //do something else
        return doSomeOtherThing().then(doSomethingMore).then(doEvenSomethingMore);
    }
}

function doSomething() {
    console.log("Inside doSomething function");
    return Promise.resolve("This message comes from doSomeThing function");
}

function doSomeOtherThing() {
    console.log("Inside doSomeOtherthing function");
    return Promise.resolve("This message comes from doSomeOtherThing function");
}

function doSomethingMore(message) {
    console.log(message);
    return Promise.resolve("Leaving doSomethingMore");
}

function doEvenSomethingMore(message) {
    console.log("Inside doEvenSomethingMore function");
    return Promise.resolve();
}

myPromiseFunction().then(conditionalChaining).then(function () {
    console.log("All done!");
}).
catch (function (e) {

});

Ayrıca, sadece bir koşullu zincirleme yapabilir, dönüş vaadini bir değişkene atayabilir ve ardından her iki şekilde çalıştırılması gereken işlevleri yürütmeye devam edebilirsiniz.

function conditionalChaining(value){
    if (value) {
        //do something
        return doSomething();
    } else{
        //do something else
        return doSomeOtherThing();
    }
}

var promise = myPromiseFunction().then(conditionalChaining);

promise.then(function(value){
    //keep executing functions that should be called either way
});

4

Koşullu vaat kullanımı için basit bir paket yazdım.

Kontrol etmek isterseniz:

npm sayfası: https://www.npmjs.com/package/promise-tree

ve github: https://github.com/shizongli94/promise-tree

Paketin sorunu nasıl çözdüğünü soran yorumlara yanıt olarak:

1, iki nesneye sahiptir.

2, Bu paketteki Branch nesnesi, then () veya catch () içinde kullanmak istediğiniz onFulfilled ve onRejected gibi işlevler için geçici bir depolama yeridir. Promise'daki muadilleriyle aynı argümanları alan then () ve catch () gibi yöntemlere sahiptir. Branch.then () veya Branch.catch () içinde bir geri aramayı ilettiğinizde, Promise.then () ve Promise.catch () ile aynı sözdizimini kullanın. Sonra geri aramaları bir dizide depolamaktan başka bir şey yapmayın.

3, Koşul, kontrol ve dallanma için koşulları ve diğer bilgileri depolayan bir JSON nesnesidir.

4, Promise geri aramalarında koşul nesnesini kullanarak koşulları (boole ifadesi) belirtirsiniz. Koşul, daha sonra ilettiğiniz bilgileri depolar. Gerekli tüm bilgiler kullanıcı tarafından sağlandıktan sonra, koşul nesnesi, daha önce Branch nesnesinde depolanan taahhüt zinciri ve geri arama bilgilerini alan tamamen yeni bir Promise nesnesi oluşturmak için bir yöntem kullanır. Buradaki biraz zor kısım, sizin (kullanıcı olarak değil uygulayıcı olarak) depolanan geri aramaları zincirlemeden önce manuel olarak oluşturduğunuz Sözü çözmeniz / reddetmeniz gerektiğidir. Bunun nedeni, aksi takdirde yeni söz zincirinin başlamamasıdır.

5, Olay döngüsü sayesinde, Branch nesneleri bir stem Promise nesnesine sahip olmadan önce veya sonra başlatılabilir ve birbirleriyle karışmazlar. Burada "dal" ve "gövde" terimlerini kullanıyorum çünkü yapı bir ağaca benziyor.

Örnek kod hem npm hem de github sayfalarında bulunabilir.

Bu arada, bu uygulama aynı zamanda bir şube içinde şubelere sahip olmanızı sağlar. Ve şubelerin koşulları kontrol ettiğiniz yerde olması gerekmez.


Görünüşe göre cevap yerine yorum sağlıyorsunuz. Yeterli itibara sahip olduğunuzda herhangi bir gönderi hakkında yorum yapabileceksiniz . Ayrıca bunun yerine ne yapabileceğimi de kontrol edin .
theway

@thewaywewere, isteğinize cevap veren uygulama detaylarını ekledim.
szl1919

0

Getirmemde bu şekilde yaptım () Bunun doğru yol olup olmadığından emin değilim, ama işe yarıyor

 fetch().then(res => res.ok ? res : false).then(res => {
    if (res) {
        //res ok
    } else {
       //res not ok
    }

});
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.