Добавление финализатора в цепочку JavaScript Promise - PullRequest
1 голос
/ 17 апреля 2020

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

Promise.resolve()
  .finally(() => console.log('cleanup'))
  .then(() => console.log('initialize'))
  .then(() => console.log('do things'))

Ответы [ 3 ]

1 голос
/ 17 апреля 2020

Возможно, я пропустил некоторые детали, но если предполагается, что finally выполняется после других обещаний, то переместите его в конец стека:

Promise.resolve()
  .then(() => console.log('initialize'))
  .then(() => console.log('do things'))
  .finally(() => console.log('cleanup'))
0 голосов
/ 17 апреля 2020

Проблема в том, что никто из ваших then() не возвращает обещание

(function () {
    'use strict';

    let promise = Promise.resolve()
        .then((data) => {
            console.log('initialize')
            return Promise.resolve('foo')
        })
        .then((data) => { // data = 'foo'
            console.log('do things')
            return new Promise((resolve, reject) => setTimeout(resolve, 2000))
        })
        .finally(() => {
            console.log('after 2 seconds, cleanup')
        })

    promise.then(() => console.log('do more things'))

})();
0 голосов
/ 17 апреля 2020

В этом случае вы можете воспользоваться Promise.all(), вот так.

const myPromise = new Promise((resolve, reject) => setTimeout(resolve, 100, 'done')).then((x) => {console.log('a'); return x;}).then((y) => {console.log('b'); return y;}).then((z) => {console.log('c'); return z;});

Promise.all([myPromise]).then((values) => {
  console.log(values);
});

Ура! 100

...