Promises 错误处理基础知识

Promises error handling basics

假设我有这样的代码,假设 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() 的承诺链中的函数或 getFromDatabase() 的承诺链中的函数。

此外,如果有像 Q.all() 中那样的顶级错误处理程序,是否需要在辅助函数中处理错误?

Who'll handle the error? The function in promise chain of Q.all() or the function in promise chain of getFromDatabase().

对于问题中的代码,错误将由 getFromDatabase() 的错误处理程序处理。但是在你的情况下,错误也不会进一步传播到 Q.all() 的错误,因为你基本上在那里处理错误并且永远不会进一步传递错误。

Also, if there is a top level error handler like in Q.all(), is there a need for handling error in helper functions?

这取决于您的业务逻辑,以及您希望从您的应用中获得什么样的行为。也许您想在内部 getFromDatabase 错误处理程序中记录错误,并将失败进一步传递给外部处理程序以获得 UI 呈现的正确错误消息。由你决定。但在这种情况下,您需要重新抛出错误或 return rejected promise from inner handler:

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