javascript - sleep 功能没有解决传递给它的 promise

标签 javascript asynchronous ecmascript-6

我想出了以下我正在努力完善的 sleep 功能:

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: UnhandledPromiseRejectionWarning: Unhandled Promise rejection (rejection id: 1): Error: Command failed: aws s3api head-bucket --bucket pr-11

我不太确定如何让我的 sleep 功能正常工作。我想我只是传递了 promise (在这种情况下,我传递了 promise 的 exec() 调用),对其执行超时,并在超时解决后将其作为新 promise 返回。

这实际上对我有用,它只是给了我那个错误,但就我的意图而言,它肯定是有效的,它解决了传递的 promisified exec(),然后再次返回包含在 promise 中的结果

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

基本上我认为我的功能所做的只是接受一个 promise ,然后在 x 毫秒后将其传回......有点像运动中的交接:)......给予并继续

最佳答案

为什么 promise 是一个参数?此函数应该创建一个 promise 。

为什么会有 try-catch?它不能失败。

你只需要这个:

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

编辑:请记住,promises 不会接受回调,您不必在 try 中手动包装它。您使用 .then().catch() 编写 promise 。 OP 有一个 promisified exec,他想把它和 sleep 结合起来。可能性是

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));

这会等待 命令完成并等待两秒(并行),然后再打印“完成”。

关于javascript - sleep 功能没有解决传递给它的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44480241/

相关文章:

c# - 异步方法的返回类型必须为 void、Task 或 Task<T>

javascript - ES6 - 遍历 JSON

javascript - 如何遍历对象原型(prototype)链中的所有属性?

javascript - 重新加载自调用函数

javascript - 在 typescript 中精炼泛型

javascript - jQuery - 自动建议/完成?

javascript - 在卸载/卸载前使用 Javascript 发送帖子请求。那可能吗?

c# - 如何从已经异步的代码创建任务?

python - 最后阻止 Tornado 生成引擎不起作用

css - 错误无法使用 webpack 找到模块