Angular中Promise / A +规范用法的done()方法

时间:2015-04-14 13:21:32

标签: javascript angularjs promise angular-promise

Here建议使用done方法结束promises链,以便重新抛出错误:

  

完成黄金法则然后使用是:要么回报你的承诺   对于其他人,或者如果链条以你结束,请致电完成终止   它。使用catch终止是不够的,因为catch处理程序   可能会抛出错误。

它是否适用于AngularJs?我看了,框架中似乎没有这样的方法。

更新

我已经查看了代码,发现了以下内容:

try {
    if (isFunction(fn)) {
        promise.resolve(fn(state.value));
    } else if (state.status === 1) {
        promise.resolve(state.value);
    } else {
        promise.reject(state.value);
    }
} catch (e) {
    promise.reject(e);
    exceptionHandler(e);
}

window.onerror = function(e) {
    // doesn't come here
}

因此,基本上角度还会在exceptionHandler(e);中记录来自promise处理程序的错误,因此不会被忽视。如果需要,可以按照here的说明覆盖默认exceptionHandler的行为。

3 个答案:

答案 0 :(得分:1)

Angular使用$ q,即:

  

受Kris Kowal的Q启发的承诺/延期对象的实现。

您需要使用角度文档中提供的the Promise API:。finally(),. then()和.catch()。

Angular很好地描述了这种差异:

  

Q具有比$ q更多的功能,但这需要以字节为单位。 $ q很小,但包含常见异步任务所需的所有重要功能。

看起来$ q中没有.done()。

希望它能回答你的问题。

答案 1 :(得分:1)

除了sebastienbarbier的答案之外,$ q角度服务还与$ digest循环(该角度在内部运行)相关联,并且(对于$ q)在Kris Kowal的Q中执行.done()函数。

这可以在测试中找到你,$ scope.digest()确保promises完全解析。

答案 2 :(得分:1)

  Promises / A +规范

done()方法

请注意,Promises仅指定then,它对done没有任何说明。

  

Q recommends来......在Angular中的使用情况如何?

Q不是$q! Angular的promise实现没有done方法,所以我建议不要使用它。

Q的黄金法则不适用于Angular,它们的功能大不相同。


Promise是异步的,因此您不能在回调周围使用try catch语句。 done用于向环境投放不可恢复的,无法捕获的内容(因此将调用window.onerrorprocess.onuncaughtexception。)

如果要捕获异常,则应使用catch方法进行回调:

$q.reject(new Error()).catch(function(e) {
    console.log("does catch an error"); 
});

要捕获未处理的拒绝(在您的承诺链的末尾),您也可以使用$exceptionHandler