Q承诺中的错误处理

时间:2016-02-25 18:19:55

标签: javascript error-handling promise q

我对理解Q promise错误处理有点困惑。我们说我有以下功能(仅用于演示):

function first() {
    console.log('first');
    var done = Q.defer();
    done.resolve('first');
    return done.promise;
}

function second() {
    console.log('second');
    var done = Q.defer();
    done.resolve('second');
    return done.promise;
}

function third() {
    console.log('third');
    var done = Q.defer();
    done.resolve('third');
    return done.promise;
}

function fourth() {
    console.log('fourth');
    var done = Q.defer();
    done.resolve('fourth');
    return done.promise;
}

function doWork() {
    return first().then(function() {
        return second();
    }).then(function() {
        return third()
    }).then(function() {
        return fourth();
    });
}

doWork().catch(function(err) {
    console.log(err);
});

一切都很顺利。

现在,如果在第二个,第三个第四个函数中,我有一些错误(例如,异步调用引发),我可以抓住它正常。

例如,如果在第二个,第三个第四个函数中,我添加:

throw new Error('async error');

错误被捕获。完美!

但令我困惑的是,如果在第一个函数中抛出错误,则不会捕获错误并且会导致我的执行中断。

请有人告诉我为什么或我做错了什么?

非常感谢!

2 个答案:

答案 0 :(得分:4)

承诺实现仅捕获then回调中的异常。如果您在throwfirst,则异常将冒泡并且只会被try-catch语句捕获。

这正是异步(承诺返回)函数should never throw的原因。相反,拒绝您要返回的承诺(done.reject(…)return Q.reject(…))。如果您不相信自己的功能,可以使用Promise.resolve().then(first).…启动您的链。

答案 1 :(得分:1)

try块中包含可能中断的逻辑,并reject块中的错误包含catch承诺。

var def = q.defer();
try {
  // sync or async logic that can break
}
catch (ex) {
  q.reject(ex);
}
return def;