Я придумал следующую функцию сна, которую я пытаюсь совершенствовать:
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 как передача обслуживания в спорте:)... отдавать и уходить
Почему обещает аргумент? Эта функция должна создать обещание.
И почему есть попытка? Это не может потерпеть неудачу.
Все, что вам нужно, это:
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));
Это ждет завершения команды и двух секунд (параллельно) перед печатью "Готово".