美文网首页
JS异步任务处理的三种解决方案

JS异步任务处理的三种解决方案

作者: 夏海峰 | 来源:发表于2019-12-10 17:04 被阅读0次

需求描述:有三个异步方法,要协同处理同一个任务。该如何判断这个任务在哪个具体的时间点上已完成了呢?

以下3方案可供参考,分别使用到了Promiseasync/awaitProxy观察者模式

三个异步任务方法,如下:

// 第一个异步方法
function asyncFn1(callback) {
  return new Promise((resolve, reject)=>{
    setTimeout(()=>{
      callback && callback(1)
      resolve(1)
    }, 1000)
  })
}

// 第二个异步方法
function asyncFn2(callback) {
  return new Promise((resolve, reject)=>{
    setTimeout(()=>{
      callback && callback(2)
      resolve(2)
    }, 2000)
  })
}

// 第三个异步方法
function asyncFn3(callback) {
  return new Promise((resolve, reject)=>{
    setTimeout(()=>{
      callback && callback(3)
      resolve(3)
    }, 3000)
  })
}

1、使用Promise来实现需求,这也是最简单的实现方案之一,参考代码如下:

Promise.all([asyncFn1(), asyncFn2(), asyncFn3()]).then(res=>{
  console.log('任务成功', res)
}).catch(err=>{
  console.log('任务失败', res)
})
  • Promise.all()方法接收一个 promise对象的数组,有且仅当这个数组中所有的promise都成功时,才会执行Promise.all([p1,p2,p3]).then()方法,即代表这三个异步任务都已完成。

2、使用async/await把异步方法转化成同步调用执行,参考代码如下:

async function doAll() {
  let r1 = await asyncFn1()
  let r2 = await asyncFn2()
  let r3 = await asyncFn3()
  console.log('任务成功', r1, r2, r3)
}

doAll()  // 执行任务

3、使用Proxy封装观察者模式来实现需求,参考代码如下:

// 观察者集合
const observer = new Set()
observer.add((target)=>{
  for(let key in target) {
    if (!target[key]) return
  }
  console.log('任务成功', target)
})

// 可观察的状态数据
const observable = obj => new Proxy(obj, {
  set(target, key, value, receiver) {
    // 更新被观察的状态数据
    const newTarget = Reflect.set(target, key, value, receiver)
    // 执行观察者集合中的观察者方法
    observer.forEach(fn=>fn(target))
    return newTarget
  },
  get(target, key) {
    return target
  }
})
// 当store中的 a、b、c都有值时,表示任务执行成功了。
let store = observable({a:null, b:null, c:null})

// 执行这三个异步方法
asyncFn1(res=>{ store.a = res })
asyncFn2(res=>{ store.b = res })
asyncFn3(res=>{ store.c = res })

本篇结束!!!

相关文章

  • JS异步任务处理的三种解决方案

    需求描述:有三个异步方法,要协同处理同一个任务。该如何判断这个任务在哪个具体的时间点上已完成了呢? 以下3方案可供...

  • JS异步编程(3)-Promise

    Promise 是 JS 异步编程中的重要概念,异步抽象处理对象,是目前比较流行的异步编程解决方案之一。主要解决了...

  • 异步的魅力:Promise

    当下js最难以处理的的就是异步的任务会什么时候完成和完成之后的回调问题。而回调函数也是最基础最常用的处理js异步操...

  • gulp 任务同步异步的思考

    js构建的时候,经常出现需要处理异步同步的,比如js:release等任务需要等待clean任务完成才可以;很容易...

  • 实战解析 | 同步音视频解决方案

    目前,国内大部分云厂商大多都提供音视频异步处理解决方案,使用中,音视频异步处理任务需要排队并且处理时间过长。当音视...

  • Python异步方式浅析-中断子线程及任务

    情景   在开发中,我们处理耗时任务时,通常考虑使用异步处理 实现方式   一般我们实现异步的方式有三种,分别如下...

  • js的三种异步处理

    Promise 对象 含义: Promise是异步编程的一种解决方案, 优点: 相比传统回调函数和事件更加合理和优...

  • 每天进步一点点——Event loop(事件循环)

    一、Event loop是什么 1、是一种处理问题的机制2、是js引擎处理异步任务的机制 js引擎的运行机制可以通...

  • 事件循环机制(消息队列)

    JS是单线程语言,因此同一时刻只能执行一行代码,因此,在遇到异步任务时,就出现了事件循环机制来处理异步任务。 任务...

  • 第七周随笔--网络请求

    需要异步处理,所以构造一个异步处理的类//异步任务处理class RequestNetworkDataTask e...

网友评论

      本文标题:JS异步任务处理的三种解决方案

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