2016-05-22 11 views
2

Angenommen, ich Code wie diesen haben, vorausgesetzt, db.get() ist ein promisified API:Promises Fehlerbehandlung Grundlagen

var promises = []; 
for(var i = 0; i < 10; i++){ 
    promises.push(getFromDatabase("age")); 
} 
Q.all(promises).then(function(results){ 
    // something 
},function(error){ 
    log.error(error) 
}); 

function getFromDatabase(property){ 
    return db.get(property).then(function(result){ 
     return result; 
    },function(error){ 
     log.error(error) 
    }) 
} 

Wer den Fehler behandeln werde? Die Funktion in der Versprechungskette von Q.all() oder die Funktion in der Versprechungskette von getFromDatabase().

Auch, wenn es eine Top-Level-Fehlerbehandlung wie in Q.all() gibt, gibt es einen Bedarf für die Behandlung von Fehler in Hilfsfunktionen?

+0

Sie sollten wahrscheinlich passieren 'null' anstelle der Identitätsfunktion zu' then', oder einfach nur 'catch' verwenden. – Bergi

+0

Siehe auch [diese Frage zum Verketten 'catch'] (http://stackoverflow.com/questions/16371129/chained-promises-not-passing-on-rejection). – Bergi

Antwort

2

Wer wird den Fehler behandeln? Die Funktion in der Versprechungskette von Q.all() oder die Funktion in der Versprechungskette von getFromDatabase().

Mit Ihrem Code in der Frage werden Fehler von getFromDatabase() Fehlerhandler behandelt. Aber in Ihrem Fall werden sich Fehler auch nicht weiter auf Q.all()'s ausbreiten, weil Sie im Grunde Fehler dort behandeln und Fehler nie weiterreichen.

Wenn es auch einen Fehlerhandler der obersten Ebene wie in Q.all() gibt, gibt es einen Bedarf für die Behandlung von Fehler in Hilfsfunktionen?

Es hängt von Ihrer Geschäftslogik ab, welches Verhalten Sie von Ihrer App erwarten. Vielleicht möchten Sie Fehler im inneren getFromDatabase Error-Handler protokollieren und Fehler weiter an den äußeren Handler für die richtige Fehlermeldung für UI-Rendering übergeben. Wie du willst. Aber in diesem Fall würden Sie müssen Fehler erneut auslösen oder abgelehnt Versprechen von inneren Handler zurück:

Q.all(promises).then(function(results){ 
    // something 
},function(error){ 
    // Render error message for UI, etc. 
}); 

function getFromDatabase(property){ 
    return db.get(property).then(function(result){ 
     return result; 
    },function(error){ 
     // just log here 
     log.error(error); 
     throw error; 
    }) 
} 
+0

so ist 'function (err) {}' mehr wie 'try-catch'. Wenn es tief in und jetzt behandelt wird, wird es nicht an die Spitze weitergegeben. Recht? –

+0

Ja, um einen Fehler an den nächsten Handler in der Kette (nach oben) zu übergeben, müssen Sie entweder das abgelehnte Versprechen oder den Wurf zurückgeben. Wenn Sie nichts zurückgeben, wie in Ihrem Code, entspricht dies dem gelösten Versprechen, was bedeutet, dass Sie den Fehler behandelt haben. – dfsq

+0

Was ist, wenn die Hilfsfunktion keinen Fehlerhandler hat? –