Как встроить систему транзакций в цепочку .then ()? - PullRequest
0 голосов
/ 03 июня 2018

У меня в коде несколько синхронных запросов.Я использую запрос-обещание пакета NodeJS.

Вот какой-то псевдокод, чтобы показать, как он отформатирован:

initRequest.then(function(response){
    return request2;
}).then(function(response2){
    return request3;
}).then(function(response3){
    return requestN;
}).catch(function(err){
    log(error)
});

Если, например, запрос3 не сработает, что произойдет?Цепочка продолжается или она полностью выходит из цикла?

И если request2 был POST, а request3 не выполнен, есть ли способ систематически откатывать данные, которые изменил request2?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Если request3 не удастся, он прекратит выполнение остальных цепочек ваших запросов.

и нет способа систематически откатить то, что изменилось request2, вам придется реализовать это по-своему.

для обработки, когда request3 не удается, перехватить request3 самостоятельно.Вот простой / мини способ обработки, когда request3 не удается

initRequest.then(function(response){
    return request2;
}).then(function(response2){
    return request3.catch(function(err2){
        //if something goes wrong do rollback
        request2Rollback.then(rollbackRes => {
            throw new Error("request3 failed! roll backed request 2!");
        }).catch(function(err){
            // the rollback itself has failed so do something serious here
            throw err;
        })
    });;
}).then(function(response3){
    return requestN;
}).catch(function(err){
    log(error)
});
0 голосов
/ 03 июня 2018

Продолжается ли цепочка или она полностью выходит из цикла?

Разрывается и переходит к catch или finally предложению ,которая доступна в последних версиях Node.js и может быть заполнена в более старых версиях - аналогично тому, как try..catch..finally работает для синхронного кода (именно так простые обещания транслируются и в функции async).

И если request2 был POST, а request3 не выполнен, есть ли способ систематически откатывать данные, которые изменил request2?

Это должно быть обеспечено разработчиком.Если существует вероятность того, что данные необходимо откатить, необходимую информацию (идентификаторы ввода данных) следует сохранить в переменных и откатить в catch.

...