如何拒绝或停止进一步的AngularJS承诺链?

时间:2019-02-03 18:22:46

标签: angularjs typescript promise angular-promise

我有两个函数,它们返回对AngularJS的$ http.post的调用。 这两个函数是savePart1()和savePart2()

savePart1 = (): IPromise<any> => {
    return $http.post(....)
}

savePart2 = (): IPromise<any> => {
    return $http.post(....)
}

如果savePart1()失败,我尝试不调用Part2()。 我做了这样的事情:

this.savePart1().then((response1) => {
    if (response1.status !== 200)
        // don't call savePart2()
        this.savePart2().then((response2) => {
            if(response1.status === 200)
            //display success message when both calls succeed
        }):
}), (error) => {
   //handle error;
}).finally();

我的问题是,如果savePart2()的响应未返回状态200(不一定是错误),如何取消调用savePart2()。 IPromise似乎没有拒绝方法。我只是从第一笔承诺中回来吗?

我的目标也是在两个调用都成功时显示成功消息。我的语法是做到这一点的最佳方法。我想在任何调用失败时添加一个错误处理程序。

1 个答案:

答案 0 :(得分:0)

看来您大部分已经实现了想要的目标。要让finally等待第二个呼叫,您可以通过then回调should return the inner promise

this.savePart1().then(response1 => {
    if (response1.status !== 200)
        return this.savePart2().then(response2 => {
//      ^^^^^^
            if (response1.status === 200)
                … // display success message when both calls succeed
            else
                … // handle non-200 status from call 2
        }, error => {
            … // handle error from call 2
        });
    else
        … // handle non-200 status from call 1
}), error => {
   … // handle error from call 1
}).finally(…);

要对错误使用通用处理程序,请switch from .then(…, …) to .then(…).catch(…)

this.savePart1().then(response1 => {
    if (response1.status !== 200)
        return this.savePart2().then(response2 => {
            if (response1.status === 200)
                … // display success message when both calls succeed
            else
                … // handle non-200 status from call 2
        });
    else
        … // handle non-200 status from call 1
}).catch(error => {
   … // handle errors from both calls
}).finally(…);

您甚至可以通过引发异常来处理意外的状态代码:

this.savePart1().then(response1 => {
    if (response1.status !== 200)
        throw new Error("unexpected status "+response1.status);
    return this.savePart2().then(response2 => {
        if (response1.status !== 200)
            throw new Error("unexpected status "+response2.status);
        … // display success message when both calls succeed
    });
}).catch(error => {
   … // handle anything
}).finally(…);

如果不需要两个响应值来显示成功消息,那么甚至可以unnest the then calls