Что `x = x.then()` делает в обещаниях?

Я пытаюсь понять некоторый код, который имеет новый подход к обещаниям:

var sequence = Promise.resolve();

sequence = sequence.then(
    function() {
        // success function
    }
);

sequence = sequence.then(
    function(keyPair) {
        // success function
    },
    function(err) {
        // err function
    }
);

sequence = sequence.then(
    function(keyPair) {
        // success function
    },
    function(err) {
        // err function
    }
);

Чем это отличается от обычной цепочки .then подход? Это безопасно для использования?

2 ответа

Решение

Чем это отличается от обычной цепочки .then подход?

Не за что. Вы можете устранить это sequence переменная и цепочка .then() вызов метода напрямую, и вы получите точно такое же поведение из своих обещаний.

Это безопасно для использования?

Да.

Зачем мне это использовать?

Обычно вы не должны. Это (по-видимому) просто сбивает с толку, в этом нет необходимости sequence переменная, и это просто дольше. Создание переменных с описательными именами может сделать код более многословным и более простым для понимания, но sequence просто бессмысленно.

Однако есть одно преимущество: вы можете создавать динамические цепочки. Вы можете поместить некоторые из этих заданий в if блокировать или даже использовать циклы для построения цепочек обещаний переменной длины и поведения. Благодаря синхронной оценке условий перед выполнением обратных вызовов обещания это может быть даже полезно для производительности (хотя и создает большее количество объектов обещаний в памяти) по сравнению с помещением всего потока управления в обратные вызовы обещания. Независимо от этого, для такого подхода следует использовать разные и описательные переменные, вместо того, чтобы повторно назначать одну и ту же переменную.

Это безопасно для использования. Это эквивалентно сцеплению, но с явным переназначением обещания, возвращенного then функция.

Другими словами, это так же, как если бы оно было написано

sequence = sequence.then(
    function() {
        // success function
    }
).then(
    function(keyPair) {
        // success function
    },
    function(err) {
        // err function
    }
).then(
    function(keyPair) {
        // success function
    },
    function(err) {
        // err function
    }
);
Другие вопросы по тегам