done() 方法在 Angular 中的承诺/A+ 规范用法



这里建议用 done 方法结束承诺链,以便重新抛出错误:

完成与然后使用的黄金法则是:要么回报你的承诺 给其他人,或者如果链以您结束,请调用 DONE 终止 它。以 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
}

所以基本上 angular 还会在 exceptionHandler(e); 中记录来自 promise 处理程序的错误,这样它就不会被忽视。如果需要,可以覆盖默认exceptionHandler的行为,如此处所述。

承诺/A+规范的done()方法

请注意,Promise 只指定了 then ,它没有说明done

Q建议...在 Angular 中的用法如何?

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

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


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

如果要捕获异常,则应将 catch 方法与回调一起使用:

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

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

角度使用$q即:

受克里斯·科瓦尔的 Q 启发的承诺/延迟对象的实现。

你需要使用角度文档中提供的 Promise API:.final()、.then() 和 .catch()。

角度很好地描述了这种差异:

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

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

希望它能回答你的问题。

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

这可能会在测试中发现,其中 $scope.digest() 确保承诺得到完全解决。

最新更新