我在使用If-Else流同步我的.then()
流时遇到了一些麻烦。代码变成意大利面条,我不确定我是在正确的时间或每个依赖项中捕获fail
。
我需要序列
1. Execute `step1`
2. Check `status` var; if OK
2a. Proceed to `step2`
2b. Proceed to `step3` with dependency on step2
2c. Proceed to `step4` with dependency on step3
Error Check: For any item in the chain, handle it with the error msg in `fail`.
代码:
function addEventItem(params) {
return step1()
.then(function(data) {
var statusOK = checkStatus();
if (statusOK) {
return step2()
.then(function(data) {
return step3();
})
.then(function(data) {
return step4();
})
.fail(function(jqXHR, textStatus, errorThrown) {
alert('A system error occurred and your action could not be completed. Please try again.');
});
我能确定吗
答案 0 :(得分:0)
代码成为spaghetti
没有办法解决这个问题。条件分支需要嵌套。
我不确定我是否会在合适的时间或每个依赖项中捕获失败。
我也不确定,因为您不清楚是否在.fail()
开始的链上发起了step1()
次调用,或者step2()
启动了链。只有在前一种情况下,才会捕获所有错误(来自链中的所有承诺,包括从回调中返回的那些承诺,例如条件链的承诺)。
尽管如此,请确保使用现代版本的jQuery,并更好地使用标准.catch
方法而不是.fail
(不链接)。
function addEventItem(params) {
step1().then(function(data) {
var statusOK = checkStatus();
if (statusOK) {
return step2().then(function(data) {
return step3();
}).then(function(data) {
return step4();
});
}
}).catch(function(jqXHR, textStatus, errorThrown) {
alert('A system error occurred and your action could not be completed. Please try again.');
});
}