Как отказаться или прекратить идти дальше в цепочке обещаний AngularJS? - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть две функции, которые возвращают вызовы AngularJS '$ http.post.Эти две функции - savePart1 () и savePart2 ()

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

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

Я пытаюсь не вызывать callPart2 (), если savePart1 () завершается ошибкой.Я сделал что-то вроде этого:

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 (), если ответ от savePart2 () не вернул статус 200 (не обязательно ошибка).У IPromise, похоже, нет метода отклонения.Я только что вернулся с первого обещания?

Также моя цель - показать сообщение об успешном завершении, когда оба вызова будут успешными.Является ли мой синтаксис лучшим способом сделать это.Я хотел бы добавить обработчик ошибок при сбое любого вызова.

1 Ответ

0 голосов
/ 03 февраля 2019

Кажется, вы в основном уже достигли того, чего хотите.Чтобы finally ожидал второго вызова, вам следует return внутреннее обещание из обратного вызова then.

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(…);

Чтобы использовать общий обработчик дляошибки, вы бы переключились бы с .then(…, …) на .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(…);

И если вам не нужны оба значения ответа для отображения сообщения об успехе, вы можете даже отменить then вызовы .

...