асинхронные функции не выполняются последовательно, как это должно быть - PullRequest
3 голосов
/ 23 января 2020

Мой код ведет себя странно. Вот фрагмент кода и его вывод:

  let files = //files is an array

  Promise.each(files, file => {
    return epub.file(file.name).async('string').then(content => {
        let mmls = //mmls is an array

        Promise.each(mmls, mml => {
          return mj.typeset({math: mml, format: 'MathML', svg: true}).then(mjdata => {
            // do something
          })
        }).then(() => {
          console.log(0)
        })
    })
  }).then(() => {
    console.log(1)
  })

Он будет входить в консоль:

0
0
0
0
0
0
0
1
0  // one '0' after '1'

Мне показалось странным, как регистрировался последний «0», если «1» 'уже зарегистрирован?

К вашему сведению: я использую синюю птицу.

1 Ответ

2 голосов
/ 23 января 2020

Скажем, выполнение обоих обещаний занимает 1 секунду, если вы не правильно связали свои обещания:

somePromise.then(() => {
    // 1.
    someOtherPromise.then(() => {
        // 3.
        console.log("inner");
    });
}).then(() => {
    // 2.
    console.log("outer");
});

Во-первых, 1. произойдет через t + 1 с. Затем он запускает someOtherPromise, но не ждет его, поэтому 1. завершается «синхронно», что приводит к выполнению 2. (при t + 1s + Ɛns). В t + 2s, 3. выполняется. Если вы подождете другое обещание, то:

somePromise.then(() => {
    // 1.
    return someOtherPromise.then(() => {
        // 2.
        console.log("inner");
    });
}).then(() => {
    // 3.
    console.log("outer");
});

Сначала, 1. произойдет после t + 1 с. Затем он запускает someOtherPromise, но ожидает его: 3. будет вызван только после разрешения возвращенного обещания. Так что 2. происходит в t + 2s, затем 3. происходит в t + 2s + Ɛns.

Примечание: в функциональном мире у вас обычно есть .map и .flatMap, но JS Promise's .then смешивает оба в зависимости от того, какой ответный вызов был возвращен благодаря динамической c печати. ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...