如何优雅的实现多个接口并发?且监听最终结果

首席Bug官
• 阅读 3348

相信大家工作中调用接口的情况很常见,有时候会有这样的需求:进入页面需要多个接口调用结束后,才能让用户进行操作!而这几个接口本身并没有先后顺序的要求。你会怎么做?

1、储存变量方法

因为接口调用是异步行为,所以我们可以在调用成功的回调函数中标记不同的变量(默认值都设置为false),等到当前接口完的时候,会把当前变量设置为true。最终判断所有变量值都为true。很明显这样会需要很多全局变量,而且很复杂。所以不推荐使用。

ES6 promise方法

我们都知道使用fetch调用接口会返回一个Promise实例,因此我们模拟一个Promise异步返回:

const wait = ms => new Promise((resolve, reject) => {
  setTimeout(() => {
      console.log(`wait ${ms}ms`)
      resolve(`wait ${ms}ms`)
  }, ms)
})

const PA = Promise.all([wait(3000), wait(1000), wait(2000)])
// 依次打印:wait 1000ms wait 2000ms wait 3000ms
//PA => Promise {<pending>}
PA.then(res => console.log(res))

通过上面Promise.all执行结果可以看出来,返回了一个新的Promise实例,可以通过.then回调处理,但是看起也是不太优雅!

配合ES7 async/await方法

ES7为处理异步方法提供Generator的语法糖写法async/await方法。

但是,如果仅仅使用await的方法,接口会被阻塞,即执行顺序变成了同步的效果了;所以,通过await + Promise的方法写起来十分优雅、简洁。

const wait = ms => new Promise((resolve, reject) => {
  setTimeout(() => {
      console.log(`wait ${ms}ms`)
      resolve(`wait ${ms}ms`)
  }, ms)
})
;(async () => {
  const PA = await Promise.all([wait(3000), wait(1000), wait(2000)])
  // 依次打印:wait 1000ms wait 2000ms wait 3000ms
  console.log(PA)
})()

//wait 1000ms 
//wait 2000ms 
//wait 3000ms 
//["wait 3000ms", "wait 1000ms", "wait 2000ms"]
点赞
收藏
评论区
推荐文章
晴空闲云 晴空闲云
4年前
JavaScript中MutationObServer监听DOM元素详解
DOM的MutationObServer接口,可以在DOM被修改时异步执行回调函数,我的理解就是可以监听DOM修改。基本使用可以通过MutationObserver构造函数实例化,参数是一个回调函数。jsletobservernewMutationObserver(()console.log("change"));console.log(obs
Easter79 Easter79
4年前
sysfs_create_group创建sysfs接口
在调试驱动,可能需要对驱动里的某些变量进行读写,或函数调用。可通过sysfs接口创建驱动对应的属性,使得可以在用户空间通过sysfs接口的show和store函数与硬件交互;Syss接口可通过sysfs\_create\_group()来创建,如果设备驱动要创建,需要用到函数宏DEVICE\_ATTR;另外总线对应BUS\_ATTR、
Chase620 Chase620
4年前
Promise从入门到拿Offer之手写Promise
1、Promise构造函数的实现Promise构造函数用来声明示例对象,需要传入一个执行器函数。其中包括resolve函数和reject函数,以及几个重要的属性:状态属性、结果属性和回调函数队列。构造函数的基本框架resolve函数用于异步处理成功后调用的函数。其中包括验证对象状态修改次数,修改promise实例对象状态,异步调用成功的回调函数
Stella981 Stella981
4年前
Dubbo 扩展点加载机制:从 Java SPI 到 Dubbo SPI
!(https://oscimg.oschina.net/oscnet/up1aa4ada0efc8a144d35d25b3443d951c7e3.JPEG)SPI全称为ServiceProviderInterface,是一种服务发现机制。当程序运行调用接口时,会根据配置文件或默认规则信息加载对应的实现类。所以在程序中并没有直接指定使用接口
Stella981 Stella981
4年前
Python接口自动化实战(第二阶段)
1.unitttest简介为什么要使用unittest?前面我们已经写代码实现了注册接口的处理调用,但是一个接口往往需要多条测试用例才能完整的覆盖到每一种情况,针对于单接口多条测试用例需要执行的情况,我们该如何处理呢?在unittest的测试类中定义多个测试方法来完成测试,这可能是大家最先想到的一个解决方法,
Wesley13 Wesley13
4年前
Java中异步注解@Async的陷阱
  或许,你在Java后端添加异步过程时会这样处理,然后摇摇大摆、灰溜溜地闪,而实际的运行结果却并不是我们期望的那样。那么,现在就将试验结果记录如下,以便少走弯路。  (一)在Controller层的公开接口直接添加@Async注解  当前端调用该种接口时会立刻结束,意味着开始即结束,不会在乎该异步接口返回的数据,其实这种接口只适合前端下发命令,后续
Wesley13 Wesley13
4年前
Java Web(九)
Listener&FilterListener  监听器1、能做什么事?  监听某一个事件的发生。状态的改变。2、监听器的内部机制  其实就是接口回调.接口回调1、需求:  A在执行循环,当循环到5的时候,通知B。 
Wesley13 Wesley13
4年前
Java开发笔记(六十)匿名内部类的优势
前面依次介绍了简单接口和扩展接口,给出的范例都是自定义的接口代码,其实Java系统本身就自带了若干行为接口,为了更好地理解系统接口的详细用法,接下来还是从一个基础的例子出发,抽丝剥茧地逐步说明接口的几种调用方式。早在阐述如何使用数组的时候,就提到Java提供了Arrays工具可用于数组变量的常见处理,例如该工具的copyOf方法用来复制数组、sort方
Wesley13 Wesley13
4年前
Java回调机制分析
Java回调是一种双向调用模式,什么意思呢,就是说,被调用方在被调用时也会调用对方,这就叫回调。“Ifyoucallme,iwillcallback”。不理解?没关系,先看看这个可以说比较经典的使用回调的方式:classA实现接口InA——背景1classA中包含一个classB
Stella981 Stella981
4年前
RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?
摘要有时候我们的项目中会用到即时通讯功能,比如电商系统中的客服聊天功能,还有在支付过程中,当用户支付成功后,第三方支付服务会回调我们的回调接口,此时我们需要通知前端支付成功。最近发现RabbitMQ可以很方便的实现即时通讯功能,如果你没有特殊的业务需求,甚至可以不写后端代码,今天给大家讲讲如何使用RabbitMQ来实现即时通讯!MQ
SPI在Java中的实现与应用 | 京东物流技术团队
1SPI的概念APIAPI在我们日常开发工作中是比较直观可以看到的,比如在Spring项目中,我们通常习惯在写service层代码前,添加一个接口层,对于service的调用一般也都是基于接口操作,通过依赖注入,可以使用接口实现类的实例。简单形容就是这样的