2017-12-27 4 views
3

Ich habe die anderen stackoverflow Antworten durchgelesen und kann keine Antwort darauf finden.Promise.all Ablehnung von API

Effektiv schreibe ich ein Modul, das einige Daten überprüft und dann, wenn es keinen Fehler gibt, es an eine Drittpartei api weitergibt.

Mein Problem ist, dass, wenn die Promise.all zurückweist, dann meine erste Anrufversprechen immer noch zum nächsten bewegt.

------my main app--------- 

const data = [1,0,1] 
api.sendData(data) 
    .then(() => { 
     *ALWAYS HITTING THIS* 
    }) 
    .catch(err => console.log(err)) 

---------the api--------- 

return await a.test(data).then(rd => { 
    return rd 
}) 
.catch(ed => { 
    return ed 
}); 

-----a.test function-------- 

let request = data.map((i) => { 
    return new Promise((resolve, reject) => { 
     if(i < 1) { 
      reject('value to low') 
     } 
     resolve(i); 
    }); 
}); 
    return await Promise.all(data) 
}); 

Könnte mir jemand sagen, warum mein Fang wird in meinem Haupt-App nicht getroffen zu werden? Der obige Code ist Pseudo, beschreibt aber das Problem.

+0

verwenden Warum, o warum so viele Menschen denken 'Rückkehr erwarten somePromise' ist immer das Richtige zu tun? Hinweis, es gibt keinen Grund, 'erwarten' dort zu verwenden. Du gibst ein Versprechen zurück, so oder so. – jfriend00

Antwort

3

denke ich, das Problem aus der Tatsache kommt man den Fehler in der API-Funktion zu fangen und die catch method return a new promise (erfüllt, wie Sie effektiv einen Wert zurückgeben)

so, wenn Sie den Fehler nicht fangen, soll Ihr Problem behoben werden wie der Fehler

return a.test(data).then(rd => { 
    // do some stuffs ... 

    return rd; 
}) 
// no catch 
+0

Sie sollten auch die sinnlosen '.then (rd => rd)'] (https://stackoverflow.com/q/41089122/1048572). Und das [sinnlose 'erwarten'] (https://stackoverflow.com/q/43353087/1048572). Wahrscheinlich die ganze Funktion :-) – Bergi

+1

hast du recht. Obwohl, ich nahm an, dass der Code für die Lesbarkeit vereinfacht wurde, während der echte Code tatsächlich etwas tut;) – laurent

+0

Danke, das war es :-) – dave

2

Sie könnten einen Tippfehler haben. Wie beschrieben, versuchen Sie Promise.all() ein Array von ganzen Zahlen, die alle auflösen werden.

Sie sollten return await Promise.all(request) anstelle von return await Promise.all(data) zurückgeben, da sonst keine abgelehnten Versprechen gegeben werden.

1

Sie nur ein Versprechen einmal fangen kann weitergeleitet werden, was Sie in dem Fang zurückkehren, wie die nächsten then lösen wird oder ablehnen:

Promise.reject(88) 
 
.catch(err=>"Hello World") 
 
.then(resolve=>console.log("resolve is:",resolve)) 
 

 
Promise.reject(88) 
 
.catch(err=>Promise.reject("Hello World"))//reject again 
 
.catch(err=>console.log("reject is:",err))

Statt:

return await a.test(data).then(rd => { 
    return rd 
}) 
.catch(ed => { 
    return ed 
});` 

Sie können einfach tun: return a.test(data)

Andere Code zur Verfügung gestellt hat keinen Sinn überhaupt. Wenn Sie einige Anfragen stellen möchten, aber alle Ergebnisse erhalten möchten, auch wenn einige von ihnen fehlschlagen, können Sie this answer (letzter Codeblock) auschecken.

Diese Antwort ein wenig über erklärt, warum Versprechen erstellt werden, würde ich Ihnen raten nicht von der Asynchron-Syntax zu verwenden, bis Sie verstehen, was ein Versprechen ist und wie them.`