Ajax .then()使用If-Else流链接/ promise

时间:2018-01-05 16:31:14

标签: jquery ajax promise

我在使用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.');
      });

我能确定吗

  • Step2将以正确的方式链接,仅当statusOK = true但不是
  • 失败会捕获函数中的所有失败吗?

1 个答案:

答案 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.');
    });
}