承诺error handling的基础知识

假设我有这样的代码,假设db.get()是一个promisified API:

 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 ) }) } 

谁来处理这个错误? Q.all()的promise链中的函数或者Q.all()的promise链中的函数。

另外,如果在Q.all()有一个顶级error handling程序,是否需要在辅助函数中处理错误?

谁来处理这个错误? Q.all()的promise链中的函数或者getFromDatabase()的promise链中的函数。

在问题中使用代码时,错误将由getFromDatabase()的error handling程序处理。 但在你的情况下,错误也不会传播到Q.all()的一个,因为你基本上处理错误,并不再传递错误。

另外,如果在Q.all()中有一个顶级error handling程序,是否需要在辅助函数中处理错误?

这取决于你的业务逻辑,你想从你的应用程序中想要什么样的行为。 也许你想在内部的getFromDatabaseerror handling程序中logging错误,并将失败进一步传递给外部处理程序,以获取适当的UI渲染错误消息。 由你决定。 但在这种情况下,您将需要重新抛出错误或从内部处理程序返回被拒绝的承诺:

 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; }) }