【发布时间】:2015-11-04 21:52:28
【问题描述】:
我正在使用本机承诺(大部分)并尝试从错误中恢复并继续执行承诺链。
实际上,我正在这样做:
- REST 查询以查看 ID 是否存在。 请注意,这会返回延迟的 jquery。
- .then(成功表示ID存在,失败则停止) (失败表示ID不存在,继续创建ID)
- .then(创建ID记录并发送到服务器)
我从被拒绝的函数中返回了一个 Promise.resolve(),这应该会导致下一个 .then 的成功部分执行。它不是。我在 Chrome 和 Safari 上试过这个。
注意第一个promise实际上是一个延迟查询,但是根据这个页面(http://api.jquery.com/deferred.then/),deferred.then()返回一个promise对象。所以添加一个额外的 .then 应该隐藏到原生的 Promise 中。
为了更清楚 - 这是伪代码:
promise = $.ajax(url);
promise = promise.then(); // convert to promise
promise.then(function() { cleanup(); return Promise.reject(); },
function(err) { return Promise.resolve(); });
.then(function() { createIdentityDetails(); });
.then(function() { sendIdentityDetails(); });
请注意,我想在 ajax 返回成功时失败,并且我想 ajax 调用失败时继续处理。
发生的情况是所有后续 .then 部分的 FAIL 函数都会执行。也就是说,我的 return Promise.resolve() 不起作用 - 这(我认为)违反了规范。
对于如何处理长承诺链中的错误并从错误中恢复的任何反馈,我将不胜感激。
非常感谢您提供的任何建议。
附言创建和收集完整的身份信息非常耗时,所以如果 ID 存在,我不想这样做。因此,我想先检查并快速失败。
p.p.s 我真的很喜欢 Promise 解开这些深度嵌套的异步回调链的方式。
【问题讨论】:
-
cleanup()、createIdentityDetails()和sendIdentityDetails()是同步的还是异步的? -
清理是同步的,其他的是异步的。
标签: javascript jquery deferred