Самый эффективный способ обеспечения последовательных команд в Javascript - PullRequest
1 голос
/ 17 марта 2020

Root Причина / Исправление:

Оказывается, это была проблема с указанным c winston-papertrail lib, который я использую, и именно поэтому он не вел себя как ожидается, даже с использованием блока .finally().

Примеры winston-papertrail не использовали end(), но нашли правильный синтаксис в вышеприведенных примерах Winston lib: https://github.com/winstonjs/winston/blob/73ae01f951600306242e00dd0d2b0a85b6d9d254/examples/finish-event.js#L28

Как только это было обнаружено, Мне удалось просто добавить его в блок .finally(), и все работало нормально , как определено в принятом ответе



Исходное сообщение:

Речь идет конкретно о Javascript или, более конкретно, языках, которые не выполняют операции «по порядку» (asyn c)

Принимая этот сценарий, где logger.close() операция должна выполняться после оператора logger.error() ...

({
  //SomePromise
})
.then( //Then something else )
.then(function() {logger.close();})
.catch(err =>
  {
    logger.error(err);
    logger.close();
  })

С Javascript, это прекрасно работает с try / finally:

.catch(err =>
  {
    try {
      logger.error(err);
    }
    finally {
      logger.close();
    }
  })

Я новичок в асин c, обещания и т. Д. c и как с ними справиться (я парень Python).

  • Есть ли более идеальный способ сделать эту работу?

  • Мне не хватает важной концепции по этому поводу, или этот метод жизнеспособен и логичен?

Ответы [ 2 ]

3 голосов
/ 17 марта 2020

Promise.prototype.finally ()

API Promise также имеет наконец .

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally

Пример MDN:

p.finally(onFinally);

p.finally(function() {
  // settled (fulfilled or rejected)
});

Применимо к вашему коду

({
  //SomePromise
})
.then( //Then something else )
.catch(err => {
    logger.error(err);
})
.finally(() => {
    logger.close();
});
0 голосов
/ 17 марта 2020

Вы слышали об asyn c await?

const asyncFunc = async () => { something };
const logger.error = async (err) => { something with err }

try {
  var result = await asyncFunc();

} catch (err) {
  await logger.error(err);

} finally {
  logger.close();
}

Итак, здесь вы выполните asyncFun c:

  • Если все пойдет хорошо, блок finally выполняется, и logger.close называется
  • . Если возникает ошибка, ключевое слово await будет ожидать завершения этого logger.error, а затем перейдет в блок finally, который вызовет logger.close
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...