NodeJS中的嵌套回调和异常处理

时间:2014-06-11 07:53:12

标签: javascript node.js asynchronous callback

我已经提出了几个答案和评论建议避免NodeJS中的嵌套回调。我相信背后有一个强烈的观点,但我无法正确理解它!

我们假设我有以下代码

module1.func1(
    function(){
        //some code
        module2.func2(
            function(){
                //some code
                module3.func3(etc....)
            }
        );
    }
);

现在让我们假设我在回调中编写的代码可能会导致异常,然后尝试将catch添加到代码中

module1.func1(
    function(){
        try{
            //some code
            module2.func2(
                function(){
                    try {
                        //some code
                        module3.func3(etc....)
                    } catch (ex){//handle exception}
                }
            );
        } catch(e){//handle exception}

    }
);

现在,我不仅有嵌套回调,还有异常处理的回调,这会增加内存上的开销!

有人建议使用step,async,wait-for但我不相信它们是性能方面的好解决方案,因为它们只提供更简单的语法,就是这样。如果我错了,请纠正我。

有没有办法避免这样的问题?提高回调嵌套代码的性能?

2 个答案:

答案 0 :(得分:4)

Promises会自动传播异步和同步错误

这是什么意思?

它表示希望正确传播错误的回调代码的代码:

try {
    doStuff1(function(err, value) {
        if (err) return caller(err);
        try {
            doStuff2(value, function(err, value2) {
                if (err) return caller(err);
                try {
                    doStuff3(value2, function(err, value3) {
                        if (err) return caller(err);
                        caller(null, [value3]);
                    });
                } catch(e) {
                    caller(e);
                }
            });
        } catch (e) {
            caller(e);
        }
    })
} catch (e) {
    caller(e);
}

可替换为:

// Returning a value normally to the caller
return doStuff1()
.then(function(value) {
    return doStuff2(value);
})
.then(function(value2) {
    return doStuff3(value2);
})
.then(function(value3) {
    return [value3];
});

答案 1 :(得分:0)

尝试使用Node.js域核心模块:http://nodejs.org/api/domain.html