承诺错误处理基础知识

时间:2016-05-22 14:47:09

标签: javascript node.js error-handling promise q

假设我有这样的代码,假设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()中的顶级错误处理程序,是否需要在辅助函数中处理错误?

1 个答案:

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