Функция сна, не разрешающая обещание, переданное в нее

1

Я придумал следующую функцию сна, которую я пытаюсь совершенствовать:

const sleep = (promise, milliseconds) => {
  return new Promise(function(resolve, reject) {
    try {
      setTimeout(() => {
        resolve(promise)
      }, milliseconds)
    }
    catch(err) {
      reject(err)
    }
  })
}

Вот пример использования:

let { error, stdout, stderr } = await sleep(exec('aws s3api head-bucket --bucket pr-${bucketName}'), 2000)

проблема в том, что я иногда получаю ошибку (не всегда): UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Command failed: aws s3api head-bucket --bucket pr-11

Я не совсем уверен, как работать сон. Я решил, что просто передам обещание (в этом случае я передаю вызов promisified exec()), выполняю тайм-аут и возвращаю его в качестве нового обещания после разрешения таймаута.

Это действительно работает для меня, это просто дает мне эту ошибку, но это определенно работает, насколько я намерен разрешить переданный promisified exec(), а затем возвращать его результаты, завернутые в обещание снова

const sleep = (promise, milliseconds) => {
  return new Promise((resolve) => {
      setTimeout(() => {
        resolve(promise)
      }, milliseconds)
  })
}

В принципе, я думаю, что моя функция заключается в том, чтобы просто взять на себя обещание, а затем передать его после x миллисекунд..kinda как передача обслуживания в спорте:)... отдавать и уходить

Теги:
ecmascript-6
asynchronous

1 ответ

3

Почему обещает аргумент? Эта функция должна создать обещание.

И почему есть попытка? Это не может потерпеть неудачу.

Все, что вам нужно, это:

const sleep = milliseconds => 
   new Promise(resolve => setTimeout(resolve, milliseconds));

Изменить: помните, что обещания не требуют обратных вызовов, и вам не нужно вручную обертывать их в попытке. Вы используете .then() и .catch() для составления обещаний. У ОП был многообещающий исполнитель, и он хотел совместить его со сном. Возможности

const cmdPromise = util.promisify(require('child_process').exec)(cmd)
  .then(() => sleep(2000))
  .then(cmdPromise)
  .then(() => console.log('Done'))
  .catch(e => console.log('Error: " + e));

Это ждет 2 секунды, затем запускает команду, ждет ее завершения и печатает "Готово".

Или, вы могли бы

cmdPromise
  .then(() => sleep(2000))
  .then(() => console.log('Done'))
  .catch(e => console.log('Error: " + e));

Которая ждет выполнения команды, затем ждет еще две секунды и печатает "Готово".

Или, и я предполагаю, что это то, что вы хотите:

Promise.all([ cmdPromise,
              sleep(2000) ])
  .then(() => console.log('Done')
  .catch(e => console.log('Error: " + e));

Это ждет завершения команды и двух секунд (параллельно) перед печатью "Готово".

  • 0
    что если я отправлю обещание? Тогда обещание создает обещание вокруг отправленного обещания?
  • 0
    Для чего будет использоваться обещанное обещание? Ты собираешься изменить это как-нибудь?
Показать ещё 19 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню