JS的ES6已经出来很久了,作为前端工程师如果对此还不熟悉有点说不过去。不过如果要问,Promise原生的api一共有哪几个?好像真的可以难倒一票人,包括我自己也忽略了其中一个不常用的API Promise.race。我们来瞧一下MDN对Promise的讲解: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

来看一下Promise的方法和prototype列表:

【1】Promise.prototype.catch 在Promise被reject的时候触发

【2】Promise.prototype.then 在Promise被resolve的时候触发

【3】Promise.prototype.finally 无论Promise是否resolve还是reject,都会触发。请注意,这个是一个比较新的特性,大部分浏览器并没有实现该特性。Promise.prototype.finally目前的浏览器兼容性列表如下:

该特性还在Stage 3阶段,等到在浏览器中大面积普及,估计要很久以后了。可以采用第三方库的实现,比如bluebird。

【4】Promise.resolve 直接返回一个已经resolve的Promise实例

【5】Promise.reject 直接返回一个已经reject的Promise实例

【6】Promise.all 传入一个Promise列表(常见的是由Promise组成的数组),只有当列表中所有的Promise都resolve时,该Promise才会resolve,只要有一个reject,则该Promise会reject。

【7】Promise.race 传入一个Promise列表,其中第一个resolve的Promise会使得该Promise.race 最终 resolve,如果第一个完成的Promise是reject的,那么Promise.race最终也reject(其实就是和跑的最快的那个Promise结果一样~)。

其实Promise的原生API也就这么几个,其中Promise.all和Promise.race是最容易被忽略的两个。我之前曾经不太熟悉Promise.race这个API导致实现一个需求卡住了很久。我们来通过一个小的练习熟悉该API的用法吧。

附上一道题目:

假设目前有1000个url下载链接,已经存储在数组url[1000]中(即url = ['http://example.com/video1.mp3', ...., 'http://example.com/video1000.mp3']),而且已经有一个函数function download,输入一个url链接,返回一个Promise,该Promise在链接下载完成的时候resolve,下载失败则reject。但是我们要求,任意时刻,同时下载的链接数量不可以超过10个。请写一段代码实现这个需求,要求尽可能快速地将该1000个链接下载完成。

思路:声明一个长度为10的,由Promise组成的数组,用Promise.race做汇总,只要检测到1个Promise resolve了,那就赶紧把那个Promise替换成一个新的再继续下载。

const TotalTaskCount = 1000; // 一共有1000个链接
const MaxConcurrency = 10; // 同时下载的链接数最大不超过10
const url = [...]; // 1000个下载链接组成的数组
const download = function (urlStr) {
// 返回Promise, 当下载完成的时候resolve
} Answer: let todoList = [];
let nextIndex = 0;
for (let j = 0; j < MaxConcurrency; j++) {
let task = download(url[nextIndex]).then(() => {return j}); // 注意这里resolve的值是任务在todoList的脚标,方便我们在Promise.race之后找到完成的任务脚标
todoList.push(task);
nextIndex++;
} const run = async function(todo) {
let index = await Promise.race(todo); // 这里index等于Promise.race第一个完成的任务的脚标
if (nextIndex < TotalTaskCount) {
todo[index] = download(url[nextIndex]).then(() => {return index;}); // 一旦有一个任务完成,马上把他替换成一个新的任务,继续下载
nextIndex++;
}
await run(todo);
} run(todoList);

ES6原生Promise的所有方法介绍(附一道应用场景题目)的更多相关文章

  1. [Es6]原生Promise的使用方法

    参考:https://www.cnblogs.com/imwtr/p/5916793.html 1.new Promise(func) 通过实例化构造函数成一个promise对象,构造函数中有个函数参 ...

  2. 浅谈ES6原生Promise

    浅谈ES6原生Promise 转载 作者:samchowgo 链接:https://segmentfault.com/a/1190000006708151 ES6标准出炉之前,一个幽灵,回调的幽灵,游 ...

  3. Node.js用ES6原生Promise对异步函数进行封装

    Promise的概念 Promise 对象用于异步(asynchronous)计算..一个Promise对象代表着一个还未完成,但预期将来会完成的操作. Promise的几种状态: pending:初 ...

  4. ES6中promise的使用方法

    先看看ES5中异步编程的使用. let ajax = function (callBlack) { setTimeout(function () { callBlack && call ...

  5. HTML DOM对象的属性和方法介绍(原生JS方法)

    HTML DOM对象的属性和方法介绍 DOM 是 Document Object Model(文档对象模型)的缩写. DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口), ...

  6. ES6的promise对象应该这样用

    ES6修补了一位Js修真者诸多的遗憾. 曾几何时,我这个小白从js非阻塞特性的坑中爬出来,当我经历了一些回调丑陋的写法和优化的尝试之后,我深深觉得js对于多线程阻塞式的开发语言而言,可能有着其太明显的 ...

  7. ES6 - promise对象

    Promise的设计初衷 我们使用ajax请求数据,得到数据后再对数据进行操作,可是有时候,对得到的数据进行操作的过程中,可能又要用到ajax请求,这时,我们的代码就变成了这样: $.ajax({ s ...

  8. ES6的promise的学习

    1.Promise的含义: Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Pro ...

  9. ES6中Promise对象个人理解

    Promise是ES6原生提供的一个用来传递异步消息的对象.它减少了传统ajax金字塔回调,可以将异步操作以同步操作的流程表达出来使得代码维护和可读性方面好很多. Promise的状态: 既然是用来传 ...

随机推荐

  1. .Net 多线程开发优化实践

    互联网产品中微服务.高并发已经成为最基本的要求.所谓高并发就是在同一时刻处理多个服务请求.为了提高高并发场景下的系统稳定性,负载均衡.消息队列等框架和技术应运而生,有效的缓解了高并发对系统整体压力.无 ...

  2. python3学习笔记(1)

    一.模块初识(接上篇)模块(库)分为两种:1.标准库:不需要安装直接可以导入的库,例:getpass.2.第三方库:必须要下载安装才可以使用.注:编辑的模块文件名不能与导入的模块名重复. 在模块文件中 ...

  3. css实现左侧固定宽,右侧自适应的7中方法

    一个面试会问的问题,如何实现两个盒子,左侧固定宽度,右侧自适应. 1.利用 calc 计算宽度的方法 css代码如下: .box{overflow: hidden;height: 100px;marg ...

  4. 关于laravel 用paginate()取值取不到的问题

    前几天在写api的时候,出现了一个比较奇怪的问题,用paginate()方法取值取不到的问题,我奇怪的是,我用paginate()方法取值是直接复制粘贴之前自己写过的api中的代码的,怎么突然取不到了 ...

  5. AbpZero双重认证之短信的坑

    一.什么是双重认证 所谓双重认证简单来说就是除了用户名密码方式外,还额外增加了一道登录屏障.登录时先输入用户名和密码,正确后会向邮箱或手机号发送一个验证码(取决于您采用何种方式,甚至可以采用银行的电子 ...

  6. 2017计算机学科夏令营上机考试-C:岛屿面积

    总时间限制:  1000ms 内存限制:  65536kB 描述 用一个n*m的二维数组表示地图,1表示陆地,0代表海水,每一格都表示一个1*1的区域.地图中的格子只能横向或者纵向连接(不能对角连接) ...

  7. SSM Spring+SpringMVC+mybatis+maven+mysql环境搭建

    SSM Spring+SpringMVC+mybatis+maven环境搭建 1.首先右键点击项目区空白处,选择new->other..在弹出框中输入maven,选择Maven Project. ...

  8. 【深度学习系列】用PaddlePaddle和Tensorflow实现AlexNet

    上周我们用PaddlePaddle和Tensorflow实现了图像分类,分别用自己手写的一个简单的CNN网络simple_cnn和LeNet-5的CNN网络识别cifar-10数据集.在上周的实验表现 ...

  9. hdu 1151 Air Raid DAG最小边覆盖 最大二分匹配

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1151 题目大意: 城镇之间互相有边,但都是单向的,并且不会构成环,现在派伞兵降落去遍历城镇,问最少最少 ...

  10. Codeforces 890C - Petya and Catacombs 模拟

    C. Petya and Catacombstime limit per test1 secondmemory limit per test256 megabytesinputstandard inp ...