美文网首页
周总结-JS依次执行多项异步任务

周总结-JS依次执行多项异步任务

作者: 一点红3340 | 来源:发表于2017-07-23 23:01 被阅读0次

1、JS依次执行多项异步任务

  • 有时候,我们希望批量执行一组异步任务,但是不是并行,而是依次执行,这组任务是动态的,在一个数组里,当然我们可以用 for 循环然后一个一个 await 执行,但是还有另外一种方式:
async function taskReducer(promise, action){
  let res = await promise;
  return action(res);
}

function sleep(ms){
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function asyncTask(i){
  await sleep(500);
  console.log(`task ${i} done`);
  return ++i;
}


[asyncTask, asyncTask, asyncTask].reduce(taskReducer, 0);

在上面的例子里,我们定义了一个 taskReducer:

async function taskReducer(promise, action){
  let res = await promise;
  return action(res);
}

这个 reducer 的两个参数是 promise 和 action,promise 是代表当前任务的 promise,而 action 是下一个要执行的任务。我们可以 await 当前 promise 执行当前任务,然后将执行结果传给下一个 action 就可以了。

这样我们可以调用:

[task1, task2, task3, ...].reduce(taskReducer, init);

不管这些任务是同步还是异步都可以被依次执行。需要注意的是,每一个任务的返回值将是下一个任务的输入 promise 或者 value。

2、generator 与 async/await 一同使用

将上面的代码进一步扩展,我们发现,它可以支持 generator 与 async/await 一同使用:

async function reducer(promise, action){
  let res = await promise;
  return action(res);
}

function tick(i){
  console.log(i);
  return new Promise(resolve => setTimeout(()=>resolve(++i), 1000));
}

function continuous(...functors){
  return async function(input){
    return await functors.reduce(reducer, input)
  }
}

function * timing(count = 5){
  for(let i = 0; i < count; i++){
    yield tick;
  }
}

continuous(...timing(10))(0);

在上面的例子里,我们定义了一个计时 tick 函数,我们通过 timing 来连续调用它,而 timing 是一个 generator,计时器显然是异步函数,然而我们可以:

continuous(...timing(10))(0);

而这里的 continuous 其实就是前面的 reduce 的封装。

相关文章

  • 周总结-JS依次执行多项异步任务

    1、JS依次执行多项异步任务 有时候,我们希望批量执行一组异步任务,但是不是并行,而是依次执行,这组任务是动态的,...

  • GCD 串行队列并行队列和同步派发异步派发

    串行队列 异步派发 不会造成线程阻塞,但是会依次执行派发任务 同步派发 依次执行派发任务,会阻塞线程 先异步派发再...

  • Javascript进阶——异步编程原理

    理解JS异步 同步和异步 同步:调用之后得到结果,再依次执行其他的任务 异步:调用之后可以不等待结果,继续做其他的...

  • js核心知识点系列——《js引擎运行机制》

    知识点: 刚接触js的时候,把js执行顺序划分为同步任务和异步任务两种,同步任务先执行完之后再去执行异步任务,然后...

  • iOS 实现并发和串行任务

    串行任务 场景:现有3个耗时任务A,B,C 需要依次有序执行。分析:为了不阻塞主线程,只能异步依次执行任务A,B,...

  • iOS • 记——多线程必知必会的原理概念

    多线程概念 同步 && 异步 同步:一个人依次执行多个任务异步:多个人同时执行多个任务 进程 && 线程 进程:1...

  • js 异步执行顺序

    js的执行顺序,先同步后异步异步中任务队列的执行顺序: 先微任务microtask队列,再宏任务macrotask...

  • JS中的异步编程

    JS中的同步编程和异步编程 同步编程:任务是按照顺序依次处理,当前这件事没有彻底做完,下一件事是执行不了的 异步编...

  • 浏览器中的事件循环

    记忆核心: JS执行: 同步任务在JS主线程(属于渲染进程的线程)执行 异步任务进入任务队列(由事件触发线程维护)...

  • 浏览器JS事件循环

    单线程 js引擎使用一个主线程来执行js代码,所以js同时仅能执行一个任务。 同步任务与异步任务 同步任务 在主线...

网友评论

      本文标题:周总结-JS依次执行多项异步任务

      本文链接:https://www.haomeiwen.com/subject/cchvkxtx.html