假设我有这样的代码,假设db.get()
是一个宣传的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()
的承诺链中的函数或getFromDatabase()
的承诺链中的函数。
另外,如果有Q.all()
中的顶级错误处理程序,是否需要在辅助函数中处理错误?
答案 0 :(得分:2)
谁会处理错误? Q.all()的promise链中的函数或getFromDatabase()的promise链中的函数。
使用您的问题中的代码,错误将由getFromDatabase()
的错误处理程序处理。但在你的情况下,错误也不会进一步传播到Q.all()
的错误,因为你基本上处理错误并且永远不会传递错误。
另外,如果Q.all()中存在顶级错误处理程序,是否需要在辅助函数中处理错误?
这取决于您的业务逻辑,您希望从您的应用中获得什么样的行为。也许您希望在内部getFromDatabase
错误处理程序中记录错误,并将故障进一步传递给外部处理程序,以便为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;
})
}