Promise.all的使用
我有一个需求如下:
有一个学生号的数组,根据这个数组,取出相关学生的所有信息。获取学生信息的接口用setTime模拟,假设每次请求需要耗时2s,代码如下
// 获取学生信息接口
function getSudent(sid) {
return new Promise((resolve, reject) => {
setTimeout(() => {
const dataBase = {
'20190101': {sid:20190101,name:'小明', age:20},
'20190102': {sid:20190102,name:'小红', age:18},
'20190103': {sid:20190102,name:'小青', age:17}
}
resolve(dataBase[sid])
}, 2000);
})
}
已知要得到信息的学生的数组如下:
const params = ['20190101', '20190102', '20190103']
触发动作为页面上的一个按钮,点击开始执行
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div class="Wrapp">
<button>测试</button>
</div>
</body>
</html>
使用传统回调(需要2s,所有请求完成)
let i = 0;
async function getStart(){
let mytimer = setInterval(() => {
i++
console.log(`等待了${i}秒`)
},1000)
let result = []
for(let i=0; i<params.length; i++){
getSudent(params[i]).then((res)=>{
result.push(res);
if(i === params.length-1){
console.log(result); //2s
clearTimeout(mytimer);
}
})
}
}
let btn = document.querySelector('button');
btn.onclick = getStart;
使用await(需要6s,所有请求完成)
let i = 0;
async function getStart(){
let mytimer = setInterval(() => {
i++
console.log(`等待了${i}秒`)
},1000);
let result = [];
for(let i=0; i<params.length; i++){
//因为这里每次请求要等2s,直至执行完成,所以优化这里即可
let res = await getSudent(params[i]);
result.push(res);
}
console.log(result)
clearTimeout(mytimer); //6s
}
let btn = document.querySelector('button');
btn.onclick = getStart;
优化await(需要2s,所有请求完成)
let i = 0;
async function getStart(){
let mytimer = setInterval(() => {
i++
console.log(`等待了${i}秒`)
},1000);
let result = []
for(let i=0; i<params.length; i++){
let res = getSudent(params[i]);
result.push(res);
}
let promiseResult = await Promise.all(result);
console.log(promiseResult); //2s
clearTimeout(mytimer);
}
let btn = document.querySelector('button');
btn.onclick = getStart;
不过针对第一种并行回调确实没什么优化,因为那个本来就是并行,Promise.all仅是把串行请求优化为并行。
还有就是如果后一个接口依赖前一个接口返回值的话,只能是串行
综上,其实Promise.all用武之地并不多
Promise.all的使用的更多相关文章
- Javascript - Promise学习笔记
最近工作轻松了点,想起了以前总是看到的一个单词promise,于是耐心下来学习了一下. 一:Promise是什么?为什么会有这个东西? 首先说明,Promise是为了解决javascript异步编 ...
- 路由的Resolve机制(需要了解promise)
angular的resovle机制,实际上是应用了promise,在进入特定的路由之前给我们一个做预处理的机会 1.在进入这个路由之前先懒加载对应的 .js $stateProvider .state ...
- angular2系列教程(七)Injectable、Promise、Interface、使用服务
今天我们要讲的ng2的service这个概念,和ng1一样,service通常用于发送http请求,但其实你可以在里面封装任何你想封装的方法,有时候控制器之间的通讯也是依靠service来完成的,让我 ...
- 闲话Promise机制
Promise的诞生与Javascript中异步编程息息相关,js中异步编程主要指的是setTimout/setInterval.DOM事件机制.ajax,通过传入回调函数实现控制反转.异步编程为js ...
- 深入理解jQuery、Angular、node中的Promise
最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...
- Promise的前世今生和妙用技巧
浏览器事件模型和回调机制 JavaScript作为单线程运行于浏览器之中,这是每本JavaScript教科书中都会被提到的.同时出于对UI线程操作的安全性考虑,JavaScript和UI线程也处于同一 ...
- JavaScript进阶之路——认识和使用Promise,重构你的Js代码
一转眼,这2015年上半年就过去了,差不多一个月没有写博客了,"罪过罪过"啊~~.进入了七月份,也就意味着我们上半年苦逼的单身生活结束了,从此刻起,我们要打起十二分的精神,开始下半 ...
- 细说Promise
一.前言 JavaScript是单线程的,固,一次只能执行一个任务,当有一个任务耗时很长时,后面的任务就必须等待.那么,有什么办法,可以解决这类问题呢?(抛开WebWorker不谈),那就是让代码异步 ...
- 浅谈Angular的 $q, defer, promise
浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00 博客园-原创精华区 原文 http://www.cnblogs.com/big-snow/ ...
- angular学习笔记(二十八-附2)-$http,$resource中的promise对象
下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...
随机推荐
- JAVA基础知识|进程与线程
一.什么是进程?什么是线程? 操作系统可以同时支持多个程序的运行,而一个程序可以狭义的认为就是一个进程.在一个进程的内部,可能包含多个顺序执行流,而每个执行流就对应一个线程. 1.1.进程 进程:是计 ...
- 消息中间件MQ
消息中间件MQ:为方便预览,将思维导图上传至印象笔记,博客园直接上传图片受限于图片大小 https://app.yinxiang.com/shard/s24/nl/27262531/c3e137a5- ...
- 指定版本下载yum离线安装包
#!/bin/bash releasever=7 for i in salt-minion salt-api salt-master docker-ce docker-ce-cli docker-co ...
- microsoft 官方学习资源
https://devblogs.microsoft.com/dotnet/ :_NET Blog https://docs.microsoft.com/zh-cn/learn/ :Microsof ...
- [ML] Roadmap: a long way to go
看上去不错的博文: 机器学习的经典算法一览 (一) 机器学习的经典算法一览 (二) 1.引言 正文将详细介绍传统机器学习算法,基本思想和用途.把问题解决思路和方法应用建议提前到这里的想法也 ...
- Centos 6.8环境下OpenLDAP安装与部署
一.OpenLDAP介绍 LDAP 全称轻量级目录访问协议(英文:Lightweight Directory Access Protocol),是一个运行在 TCP/IP 上的目录访问协议.LDAP实 ...
- MySQL网页端在线查询工具
现在许多应用都移到云服务器上面了,数据库的远程维护.监控成为一大问题,通过TreeSoft数据库管理系统,可以方便的使用浏览器,通过网页操作的方式管理MySQL,Oracle,DB2,PostgreS ...
- 用于Python文件转换.exe文件的pyinstaller工具安装
安装方法: 注:python环境一定要配置好. 1.第一步:下载 官方网站:http://www.pyinstaller.org/downloads.html 此处下载版本为稳定版. 2.第二步:下载 ...
- ORB-特征点提取代码比较
ORB特征提取代码测试 整合ICE-BA.ORB-SLAM2.openvslam中的ORB提取代码,并比较速度,方便以后使用 1. ORB-SLAM2 vsICE-BA vs openvslam IC ...
- jdbc访问oracle超慢,但是PLSQL访问正常
oracle数据库连接非常慢,sqlplus很快,用客户端就很慢,十几秒才好.然后服务器内存一下就飙升到了90%,最开始以为是表空间占满了,数据库连接数占满了.折腾了半天,重启,还是很慢.应用连接数据 ...