2016-09-01 4 views
0

ich mit dem Versprechen habe SchwierigkeitenNodeJS Promise() Fehler beim Schlucken

den folgenden Ausschnitt mit:

Promise.resolve() 
 
    .then(a("OK1")) 
 
    .then(a("OK2")) 
 
    .then(a("OK3")) 
 
    .then(a("OK4")) 
 
    .then(a("OK5")) 
 
    .then(function() { 
 
     console.log("FINISH"); 
 
    }) 
 
    .catch(function(e) { 
 
     
 
     console.log("ERROR: " + e); 
 
    }); 
 

 

 
function a(i) { 
 
    return new Promise(function(resolve, reject) { 
 
     
 
     if(i == "OK4") { 
 
      console.log("THROW"); 
 
      throw('Error'); //This does not happen 
 
      reject(); 
 
      return; 
 
     } 
 
     if(i == "OK2") { 
 
      reject() 
 
      return; 
 
     } 
 
     console.log(i); 
 
     resolve(); 
 
    }); 
 
}

Ich möchte ein Versprechen ablehnen können - dann ist der nächste .then wird ausgeführt ("OK3") aber ich bin nicht in der Lage, Ausnahmen zu werfen - ich möchte das .catch auf "OK4"

auslösen

OK4 - wird abgelehnt und nicht ausgegeben, aber OK5 wird noch ausgeführt - gibt es einen Weg dazu?

dies würde meine erwartete Ausgabe sein:

OK1 
OK3 
ERROR: .... 
+3

Sie müssen eine Funktion an "dann" übergeben, kein Versprechen. Sie führen alle Ihre Funktionen ohne Verkettung aus. – Bergi

+0

ok und wie würde ich mit einer async-Funktion umgehen? Funktion a (x) { setTimeout (function() {// HOW VON HIER LÖSEN }, 2000?); –

+0

Sie müssen es in einen 'Promise'-Konstruktoraufruf einbinden, genau wie Sie es in Ihrer Frage getan haben, so dass' resolve' durch Schließen verfügbar ist. Nicht sicher, dass ich die Frage verstehe? – Bergi

Antwort

1

Wie Bergi erwähnt, ist der Parameter, den Sie auf jedem .then vorbei sind läuft die Funktion sofort und ein Versprechen zurück. Die Versprechenskette benötigt einen Verweis auf eine Funktion, die zu einem späteren Zeitpunkt ausgeführt werden kann.

Wenn Sie Ihre Funktion mit einem Parameter ausführen möchten, können Sie sie in eine anonyme Funktion einfügen, sodass die Versprechenskette die anonyme Funktion zu einem späteren Zeitpunkt ausführen kann.

a("OK1") 
    .then((res)=>{ 
    return a("OK2") 
    }) 
    .then((res)=>{ 
    return a("OK3") 
    }) 
    .then((res)=>{ 
    return a("OK4") 
    }) 
    .then((res)=>{ 
    return a("OK5") 
    }) 
    .then(()=>{ 
    console.log("FINISH"); 
    }) 
    .catch(function(e) { 
    console.log("ERROR: " + e); 
    }); 


function a (i) { 
    return new Promise(function(resolve, reject) { 

     if(i == "OK4") { 
      console.log("THROW"); 
      throw new Error(i); //This does not happen 
     } 
     if(i == "OK2") { 
      return reject(new Error(i)) 
     } 
     setTimeout(function() { 
      console.log(i); 
      resolve(i); 
     }, 100) 
    }); 
} 

Es ist in Ordnung, eine Funktion zu übergeben, die schließlich ein Versprechen zurückgibt. Der Funktion wird der Wert übergeben, mit dem das vorherige Versprechen gelöst wurde.

b(1) 
    .then(b) 
    .then(b) 
    .then(b) 
    .then((res) => { 
    console.log("FINISH",res); 
    }) 
    .catch(function (e) { 
    console.log("ERROR: " + e); 
    }); 

function b (i) { 
    return new Promise(function (resolve, reject) { 
    console.log(i) 
    resolve(i+1) 
    }) 
} 
+0

danke als @Bergi erwähnt das Hauptproblem war die Funktion, die Änderung zu einer Variation von Matt hat es getan. thx Jungs –

Verwandte Themen