2017-12-12 3 views
0

Hallo allerseits!.Catch-Funktion nicht zurückgewiesen Wert

Ich benutze Node.js v8.5.0. Und dies ist mein Code in Node.js (vereinfacht):

// function that returns promise 
    const request = (url) => 
     new Promise((resolve, reject) => { 
     superagent 
      .get(url) 
      .end((err, res) => { 
      if (err || !res.ok) { 
       reject(err); 
       return; 
      } 

      resolve(res); 
      }) 
     }) 

    // function that add .then and .catch to promise 
    const to = promise => 
    promise 
    .then((data) => [null, data]) 
    .catch((err) => [err]); 

    // making request 
    let [err, result] = await to(request()); 

Wenn ich tun Anfrage und einige Fehler tritt .catch Funktion doesnt fangen Wert abgelehnt und ich bekomme Fehler wie Unhandle Versprechen Ablehnung . Aber, in der Tat habe ich hinzugefügt .Catch Funktion zu versprechen.

Weiß jemand, was hier falsch ist? Danke für Hilfe!

+0

zurückgeben neue Versprechen –

+0

Aber Versprechen ist nicht mit Anfrage Methode verbunden, ist es? –

+0

Warum gibst du nicht das "superagent" Versprechen zurück? Das Erstellen eines neuen Versprechens ist ein Anti-Muster – charlietfl

Antwort

2

Ein Superagent Anfrage bereits gibt ein Versprechen, so dass anstelle

const request = (url) => superagent.get(url).then(res=> {/*transform res**/ return res}) 
+0

... was wahrscheinlich auch der Grund ist, warum die unbehandelte Ablehnung auftritt - dieses überragende Versprechen ist das, das abgelehnt und nicht behandelt wird, nicht das 'neue Versprechen', das tatsächlich ein' .Catch' hat angekettet. (Das hört sich natürlich nach einem superagenten Bug an, der Aufruf von '.end()' sollte das Versprechen als erledigt markieren). – Bergi

+0

'.then' Funktion funktioniert gut in meinem Code. Aber wenn ein Fehler auftritt, fängt die ".Catch" -Funktion keinen Fehler ab. Das ist seltsam, weil es in der Tat hinzugefügt wird, um über 'to' zu versprechen. – Emil

+0

Vielleicht haben Sie andere Anti-Pattern-Versprechungen Verpackung etwas anderes, die auch Versprechen zurückgibt und wie bergi darauf hinweist, es ist ein anderes Versprechen nicht in der Kette, die nicht behandelt wird – charlietfl

0

Der Code, den Sie zur Verfügung gestellt nicht, dass das Verhalten, aber ich bin mit dem abgefangene in Versprechen Warnung.

Wenn Sie später einen Fehler eines Versprechens fangen wollen, müssen Sie es zuerst fangen und das Versprechen zurückgeben, bevor Sie es fangen.

Nachfolgend erhalten Sie in Versprechen Warnung abgefangene geben:

var failPromise = val => Promise.reject(val); 
var to = async promise => promise.then(val=>[null,val]).catch(err=>[err]); 
var p = failPromise(88); 
//later you will catch the error 
setTimeout(()=>to(p).then(val=>console.log("resolved to:",val)),100); 

Aber wenn man es ein wenig ändern, dann werden Sie nicht

var failPromise = val => { 
    const p = Promise.reject(val); 
    p.catch(ignore=>ignore); 
    return p;//return the promise that did not have the catch 
}; 
var to = async promise => promise.then(val=>[null,val]).catch(err=>[err]); 
var p = failPromise(88); 
//later you will catch the error 
setTimeout(()=>to(p).then(val=>console.log("resolved to:",val)),100); 

Wie zuvor vorgeschlagen; Ihre Anfrage Methode sollte nur das Versprechen zurück, die Renditen aber Superagent in einer Weise, dass Sie ohne die Fehler (Warnungen) später die ablehnen fangen:

const request = (url) => { 
    const p = superagent 
    .get(url); 
    p.catch(ignore=>ignore); 
    return p; 
}) 

Wenn Sie sich fragen, warum Sie in Versprechen nicht abgefangene bekommen; Das liegt daran, dass Sie die Zurückweisung in der Warteschlange und nicht im Stapel abfangen. Stack und Warteschlange wird erklärt here.

Das Beispiel, das im Stapel abfängt, verursacht keine Fehler in der Konsole, aber gibt dann das Versprechen zurück, das den Haken nicht hatte. Je nachdem, wie weit in der Warteschlange Sie es fangen, kann es Ihnen immer noch Fehler geben, aber im Code vorausgesetzt wird es nicht.

+2

Es gibt keine Gründe, warum Sie das superagende Versprechen selbst einholen müssen. Es wird in der Kette gefangen in OP-Code – charlietfl

+0

@charlietfl Code OP gebucht ist offensichtlich nicht der Code, der ihm den Fehler gibt er spricht noch tut es die Art und Weise beschreibt OP. Wenn OP den bereitgestellten Code getestet hätte, würde OP wissen, dass dies nicht der Fall ist. Aktualisierte Antwort, um zu erklären, woher das ungeteilte Versprechen kommt. – HMR

+0

Akzeptieren Sie das. Es gibt noch etwas anderes, was uns nicht zeigt – charlietfl

Verwandte Themen