【JS】实现一个队列处理程序,当传入任务队列时,能够串行地处理完任务

题目说明

  • 请实现一个队列处理程序,当传入任务队列时,能够串行地处理完任务,
  • 如果传入的任务包含异步执行,那么必须确保异步执行完毕之后才会执行后面的任务。
function queue(list){
}

function task1(next){
  setTimeout(function(){
    console.log(1);
    next();
  }, 1000)
}
function task2(next){

  console.log(2)
  next();
}
function task3(next){

  setTimeout(function(){
    console.log(3);
    next();
  }, 200)
}
queue([task1, task2, task3])
// 按顺序输出 1, 2, 3

解法一:Promise

    function queue(list) {
      list.reduce(
        (p, cur) => p.then(() => new Promise((resolve) => cur(resolve))),
        Promise.resolve()
      )
    }
  • 利用reduce迭代队列,初始化一个成功的Promise对象,将resolve函数作为参数传入队列函数中,因此,当输出1后,执行resolve()时 ,Promise状态才改变,此时p替代。

解法二:async

  • 将每一个队列参数包装成Promise
	async function queue(list) {
      for (let index = 0; index < list.length; index++) {
        const element = list[index]
        await makePromise(element)
      }
    }

    function makePromise(fn) {
      return new Promise((resolve) => {
        fn(resolve)
      })
    }

解法三:递归

function queue(list) {
  list= [...list]
  const step = () => {
    const run = list.shift()
    if (run) {
      run(step)
    }
  }
  step()
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值