2017-12-21 4 views
1

Ich benutze Node-libcurl. Ich habe ein kleines Modul, in dem ich eine Warteschlange für Lockenanfragen habe. Hier ist, was die Funktion wie folgt aussieht, um tatsächlich die Locke Anfrage zu machen:Knoten geben UnhandledPromiseRejection Warnung, wenn ich bin * sicher * Ich fange die Ablehnung

const Curl = require('node-libcurl').Curl; 

let timeoutCount = 0; 
function _getOData(url) { 
    const curl = new Curl(); 
    return new Promise((resolve, reject) => { 
     curl.setOpt(Curl.option.URL, url); 
     curl.setOpt(Curl.option.HTTPAUTH, Curl.auth.NTLM); 
     curl.setOpt(Curl.option.SSL_VERIFYPEER, false); 
     curl.setOpt(Curl.option.SSL_VERIFYHOST, false); 
     curl.setOpt(Curl.option.POST, 0); 
     curl.setOpt(Curl.option.HTTPHEADER, ['Accept: application/json']); 

     let done = false; 

     curl.on('end', function (statusCode, body, headers) { 
      done = true; 
      const retObj = JSON.parse(body); 
      resolve(retObj); 
      curl.close(); 
     }); 

     curl.on('error', function (e) { 
      done = true; 
      reject(e); 
      curl.close(); 
     }); 

     curl.perform(); 

     setTimeout(() => { 
      if (!done) { 
       timeoutCount++; 
       reject(new Error(`request timed out: ${timeoutCount}`)); 
      } 
     },1000*10); 
    }) 
} 

ich in der Konsole immer diese Fehlermeldung gehalten: (node:26616) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 6): Error: request timed out - also habe ich hinzugefügt, um die die timeoutCount, weil ich sicher war, ich war alle Versprechen Fehler zu kontrollieren, trotz diese Warnung erhalten.

Jeder Aufruf der _getOData Funktion geschieht in der Warteschlange Logik, speziell dieser Code der einzige Code ist _getOData zu nennen:

 const p = _getOData(nextObj.url); 
     p.then(nextObj.cb); 
     p.catch((e) => { 
      if (e.message.includes("request timed out")) { 
       queue.add(nextObj.url, nextObj.cb, nextObj.ecb); 
       return true; 
      } else { 
       nextObj.ecb(e); 
       return false; 
      } 
     }); 

Also habe ich einen Haltepunkt nach e.message.includes("request timed out") und es trifft es jedes Mal ein Zeitüberschreitungsfehler tritt auf, daher weiß ich, dass es keine "unbehandelten Versprechensverweigerungen" gibt. Jede einzelne Ablehnung von Versprechen geht durch diesen Haken. Ich überprüfe die Variable, wenn sie dort bricht, um sicherzustellen, dass der timeoutCount da ist, und es immer ist, und dann immer noch auf der Konsole als unbehandelte Versprechen Ablehnung protokolliert wird.

Was geht hier vor?

+2

Sie fangen nicht die mögliche Ablehnung hier 'p.then (nextObj.cb);' - es gibt keine Verspätung auf das Versprechen von '.then' –

+1

@JaromandaX sicherlich alles, was zählt, ist, dass ich das Versprechen einhole von 'p', unabhängig davon * wo * ich es erwische. Es ist nicht in p.then() gefangen, es ist danach gefangen. – TKoL

+0

Oh, ich glaube, ich habe falsch gelesen, was du zuerst gesagt hast @ JaromandaX, aber ich bin mir sicher, dass das Versprechen, das von mir kommt, nicht falsch ist. Ich weiß für eine Tatsache, dass der Fehler, den es sagt, unbehandelt ist, ist der Fehler innerhalb meiner 'p.catch', weil es console.log die Fehlermeldung und ich habe es überprüft, dass dieser Fehler ist. – TKoL

Antwort

2

Sie fangen die Ablehnung wahrscheinlich in der Warteschlange und nicht auf dem Stapel. Sie erhalten diesen Fehler (Warnung) mit dem folgenden Code:

var p = Promise.reject("hello world");//do not catch on the stack 
setTimeout(
    x=>p.catch(err=>console.log("catching:",err))//caught error on queue 
    ,100 
); 

Wenn Sie vorhaben, das ablehnen in der Warteschlange zu fangen, dann können Sie wie folgt vorgehen:

saveReject = p =>{ 
    p.catch(ignore=>ignore); 
    return p;//catch p but return p without catch 
} 
var p = saveReject(Promise.reject("hello world"));//creating promise on the stack 
setTimeout(
    x=>p.catch(err=>console.log("catching:",err))//caught error on queue 
    ,100 
); 

Informationen über Warteschlange und Stapel kann here gefunden werden.

Verwandte Themen