我有一个需求如下:

有一个学生号的数组,根据这个数组,取出相关学生的所有信息。获取学生信息的接口用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的使用的更多相关文章

  1. Javascript - Promise学习笔记

    最近工作轻松了点,想起了以前总是看到的一个单词promise,于是耐心下来学习了一下.   一:Promise是什么?为什么会有这个东西? 首先说明,Promise是为了解决javascript异步编 ...

  2. 路由的Resolve机制(需要了解promise)

    angular的resovle机制,实际上是应用了promise,在进入特定的路由之前给我们一个做预处理的机会 1.在进入这个路由之前先懒加载对应的 .js $stateProvider .state ...

  3. angular2系列教程(七)Injectable、Promise、Interface、使用服务

    今天我们要讲的ng2的service这个概念,和ng1一样,service通常用于发送http请求,但其实你可以在里面封装任何你想封装的方法,有时候控制器之间的通讯也是依靠service来完成的,让我 ...

  4. 闲话Promise机制

    Promise的诞生与Javascript中异步编程息息相关,js中异步编程主要指的是setTimout/setInterval.DOM事件机制.ajax,通过传入回调函数实现控制反转.异步编程为js ...

  5. 深入理解jQuery、Angular、node中的Promise

    最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...

  6. Promise的前世今生和妙用技巧

    浏览器事件模型和回调机制 JavaScript作为单线程运行于浏览器之中,这是每本JavaScript教科书中都会被提到的.同时出于对UI线程操作的安全性考虑,JavaScript和UI线程也处于同一 ...

  7. JavaScript进阶之路——认识和使用Promise,重构你的Js代码

    一转眼,这2015年上半年就过去了,差不多一个月没有写博客了,"罪过罪过"啊~~.进入了七月份,也就意味着我们上半年苦逼的单身生活结束了,从此刻起,我们要打起十二分的精神,开始下半 ...

  8. 细说Promise

    一.前言 JavaScript是单线程的,固,一次只能执行一个任务,当有一个任务耗时很长时,后面的任务就必须等待.那么,有什么办法,可以解决这类问题呢?(抛开WebWorker不谈),那就是让代码异步 ...

  9. 浅谈Angular的 $q, defer, promise

    浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00  博客园-原创精华区 原文  http://www.cnblogs.com/big-snow/ ...

  10. angular学习笔记(二十八-附2)-$http,$resource中的promise对象

    下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...

随机推荐

  1. this关键字的用法小结

    1.this :指它所在函数所属对象的引用. 简单说:哪个对象调用this所在的函数,this就指哪个对象. 主要是为了区分:成员变量和局部变量 2.构造函数之间的调用用this关键字,如,this( ...

  2. nginx 配置简单反向代理

    假设端口号是 3000 server { listen ; server_name your.domain; location / { proxy_pass http://127.0.0.1:3000 ...

  3. java设计模式简述

    1.代理模式:有一个接口或者顶层类(可以是抽象的)A,一个实现类B,一个代理类C,代理类C之所以能够是代理类,是因为1.C也实现了A.2.C持有A的依赖,用来注入真实的实现B.3.C的实现方法中实际调 ...

  4. [oracle]oracle表在什么情况下会被锁住(转载)

    DML锁又可以分为,行锁.表锁.死锁 行锁:当事务执行数据库插入.更新.删除操作时,该事务自动获得操作表中操作行的排它锁. 表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它 ...

  5. python从入门到放弃之anconada真愁人

    原先未使用anconada,用的python2.7,每次install各种包各种问题真的心累 后来装了anconada,安装了python3.6 使用起来比较方便了. 陆续将遇到的问题更新如下~  一 ...

  6. VBA 格式化excel数据表 (数据分列)

    Sub ImportData() ' ' Copy Data from one workbook to the Current Workbook ' Place the macro file in t ...

  7. python3 @classmethod 和 @staticmethod 的区别

    如果您将某个东西定义为classmethod,这可能是因为您打算从类而不是类实例中调用它. 定义类方法的几种方式: 常规方式                       : 需要self隐士传递当前类 ...

  8. 硬核讲解 Jetpack 之 LifeCycle 源码篇

    前一篇 硬核讲解 Jetpack 之 LifeCycle 使用篇 主要介绍了 LifeCycle 存在的意义,基本和进阶的使用方法.今天话不多说,直接开始撸源码. 本文基于我手里的 android_9 ...

  9. [C++]Yellow Cards - GYM - 102348A(Practice *) - CodeForces

    1 Problem Description Problem The final match of the Berland Football Cup has been held recently. Th ...

  10. Pycharm连接windows上python

    首先我们需要下载一个Python安装包,然后将安装包解压到某个盘符下, 然后我们打开Pycharm软件,点击左上角的File菜单,接着选择Settings选项,如下图所示 在弹出的Settings界面 ...