2017-11-08 9 views
1

Ich habe ein Versprechen Kette:Wie vermeidet man wiederholten Code in der Versprechenskette?

Promise 
.then(function() { 
    if (some condition) { 
     Promise.reject("Request cancelled"); 
    } 

    return doSomething1(); 
}) 
.then(function() { 
    if (some condition) { 
     Promise.reject("Request cancelled"); 
    } 

    return doSomething2(); 
}) 
.then(function() { 
    if (some condition) { 
     Promise.reject("Request cancelled"); 
    } 

    return doSomething3(); 
}) 
.catch(function(err) { 
    if (err == "Request cancelled") { 
     // err handling here 
    } 
}) 

In jedem .then(), gibt es gleiche Stück Code zu überprüfen, ob das Versprechen Kette zu brechen:

// repeated code 
if (some condition) { 
    Promise.reject("Request cancelled"); 
} 

Ich muss dies tun, weil ich will, Halte den Rest der Async-Aufrufe sofort auf, sobald ich den Fehler bemerkt habe, damit die App Speicher und Zeit sparen kann. Aber es sieht wirklich chaotisch und überflüssig aus.

Meine Frage ist also: Gibt es eine Möglichkeit, diesen Code zu schreiben und wiederholten Code zu vermeiden?

Vielen Dank!

Antwort

0

Wenn Sie nicht diese Logik in doSomething1() bauen gehen und doSomething2(), damit sie sich ein abgelehnter Versprechen zurück, wenn die Bedingung erfüllt ist, dann ist die einfachste Sache, die ich denken kann, ist, dies zu ändern:

p.then(function() { 
    if (some condition) { 
     Promise.reject("Request cancelled"); 
    } 

    return doSomething1(); 
}).then(function() { 
    if (some condition) { 
     Promise.reject("Request cancelled"); 
    } 

    return doSomething2(); 
}).then(...).catch(...); 

etwas wie folgt aus:

p.then(checkCondition).then(function() { 
    return doSomething1().then(checkCondition); 
}).then(function() { 
    return doSomething2().then(checkCondition); 
}).then(...).catch(...); 

Wo Sie checkCondition() definieren darin Ihre freigegebenen Zustand haben:

function checkCondition(val) 
    if (some condition) { 
     return Promise.reject("Request cancelled"); 
    } 
    return val; 
} 

Oder Sie könnten Ihre Versprechen der Rückkehr Funktionen wickeln:

p.then(checkCondition).then(function() { 
    return checkCondition(doSomething1()); 
}).then(function() { 
    return checkCondition(doSomething2()); 
}).then(...).catch(...); 

Wo checkCondition() ist wie folgt:

function checkCondition(p) { 
    return p.then(function(val) { 
     if (some condition) { 
      return Promise.reject("Request cancelled"); 
     } 
     return val; 
    }); 
} 

Wenn es wirklich nichts ist, aber die Sequenzierung diese async Funktionsaufrufe und Überprüfen Sie diese bestimmte Bedingung auf ihnen, dann können Sie alles automatisieren, indem Sie eine Reihe von Funktionen und s übergeben Angleichen des Arrays, Überprüfen der Bedingung für jedes Ergebnis.

+0

Vielen Dank! :) Ich werde sie ausprobieren – Max

+0

@Max - wenn dies Ihre Frage beantwortet, können Sie dies der Gemeinschaft anzeigen, indem Sie auf das Häkchen auf der linken Seite der Antwort klicken. Dadurch erhalten Sie auch einige Reputationspunkte für das richtige Vorgehen. – jfriend00

Verwandte Themen