微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在javascript中的函数内动态链接promise?

如何解决如何在javascript中的函数内动态链接promise?

我有以下练习:

let standInLine = (() => {
  return function(logAfter) {
    return function b(seconds) {
      return new Promise((resolve) => {
        setTimeout(() => {
          console.log(`${seconds} has passed`)
          resolve(b(seconds));
        },seconds * 1000);
      }) //what to do here to chain the promises
    }
  }
})();
{
  let politeLogAfter = standInLine(logAfter);
  politeLogAfter(5);
  politeLogAfter(3);
  politeLogAfter(4);
}

我需要链接承诺,换句话说,我需要动态链接返回的承诺,我应该在函数 standInLine 中添加 .then() 但我不知道该怎么做,有什么帮助吗? 结果应该是:

暂停 5 秒

记录“5秒过去了”

暂停 3 秒

记录“3 秒过去了”

暂停 4 秒

记录“4 秒过去了”

解决方法

您可以通过始终在其上使用 .then() 将单个 Promise 用作队列:

let standInLine = (() => {
  // create a queue
  let queue = Promise.resolve();

  return function(logAfter) {
    return function b(seconds) {
      //add to the end of the queue
      queue = queue.then(() => new Promise((resolve) => {
        setTimeout(() => {
          console.log(`${seconds} has passed`)
          resolve(b(seconds));
        },seconds * 1000);
      }))
    }
  }
})();
const logAfter = 10;
{
  let politeLogAfter = standInLine(logAfter);
  politeLogAfter(5);
  politeLogAfter(3);
  politeLogAfter(4);
}

,

const sleep = (seconds) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve()
    },seconds * 1000)
  })
}

const standInLine = async(seconds) => {
  await sleep(seconds)
  console.log(`${seconds} has passed`)
}

const chain = async() => {
  await standInLine(5)
  await standInLine(3)
  await standInLine(2)
}

chain()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。