Вопрос:

Как избежать повторения кода в цепочке обещаний?

promise coding-style code-cleanup

34 просмотра

1 ответ

8 Репутация автора

У меня есть цепочка обещаний:

Promise
.then(function() {
    if (some condition) {
        Promise.reject("Request cancelled");
    }

    return doSomething1();
})
.then(function() {
    if (some condition) {
        Promise.reject("Request cancelled");
    }

    return doSomething2();
})
.then(function() {
    if (some condition) {
        Promise.reject("Request cancelled");
    }

    return doSomething3();
})
.catch(function(err) {
    if (err == "Request cancelled") {
        // err handling here
    }
})

В каждом .then () есть один и тот же фрагмент кода, проверяющий, нарушать ли цепочку обещаний:

// repeated code
if (some condition) {
    Promise.reject("Request cancelled");
}

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

Итак, мой вопрос: есть ли способ написать этот код и избежать повторного кода?

Спасибо!

Автор: Max Источник Размещён: 08.11.2017 10:31

Ответы (1)


0 плюса

470461 Репутация автора

Решение

Если вы не собираетесь встраивать эту логику doSomething1()и doSomething2()чтобы они сами возвращали отклоненное обещание при выполнении условия, то самое простое, что я могу придумать, это изменить это:

p.then(function() {
    if (some condition) {
        Promise.reject("Request cancelled");
    }

    return doSomething1();
}).then(function() {
    if (some condition) {
        Promise.reject("Request cancelled");
    }

    return doSomething2();
}).then(...).catch(...);

что-то вроде этого:

p.then(checkCondition).then(function() {
    return doSomething1().then(checkCondition);
}).then(function() {
    return doSomething2().then(checkCondition);
}).then(...).catch(...);

Где, вы определяете, checkCondition()чтобы иметь ваше общее состояние в нем:

function checkCondition(val)
    if (some condition) {
        return Promise.reject("Request cancelled");
    }
    return val;
}

Или вы можете обернуть свои обещания, возвращающие функции:

p.then(checkCondition).then(function() {
    return checkCondition(doSomething1());
}).then(function() {
    return checkCondition(doSomething2());
}).then(...).catch(...);

Где checkCondition()это так:

function checkCondition(p) {
    return p.then(function(val) {
        if (some condition) {
            return Promise.reject("Request cancelled");
        }
        return val;
    });
}

Если на самом деле нет ничего, кроме последовательности этих вызовов асинхронных функций и проверки этого конкретного условия на них, то вы можете автоматизировать все это, передав массив функций и упорядочив массив, проверяя условие для каждого результата.

Автор: jfriend00 Размещён: 08.11.2017 10:57
Вопросы из категории :
32x32