[转]JS - Promise使用详解2(ES6中的Promise)
原文地址:https://www.hangge.com/blog/cache/detail_1638.html
2015年6月, ES2015(即 ECMAScript 6、ES6) 正式发布。其中 Promise 被列为正式规范,成为 ES6 中最重要的特性之一。
1,then()方法
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
 | 
//做饭function cook(){    console.log('开始做饭。');    var p = new Promise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('做饭完毕!');            resolve('鸡蛋炒饭');        }, 1000);    });    return p;}//吃饭function eat(data){    console.log('开始吃饭:' + data);    var p = new Promise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('吃饭完毕!');            resolve('一块碗和一双筷子');        }, 2000);    });    return p;}function wash(data){    console.log('开始洗碗:' + data);    var p = new Promise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('洗碗完毕!');            resolve('干净的碗筷');        }, 2000);    });    return p;} | 
(2)使用 then 链式调用这三个方法:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
 | 
cook().then(function(data){    return eat(data);}).then(function(data){    return wash(data);}).then(function(data){    console.log(data);}); | 
当然上面代码还可以简化成如下:
| 
 1 
2 
3 
4 
5 
6 
 | 
cook().then(eat).then(wash).then(function(data){    console.log(data);}); | 
(3)运行结果如下:

2,reject()方法
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
 | 
//做饭function cook(){    console.log('开始做饭。');    var p = new Promise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('做饭失败!');            reject('烧焦的米饭');        }, 1000);    });    return p;}//吃饭function eat(data){    console.log('开始吃饭:' + data);    var p = new Promise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('吃饭完毕!');            resolve('一块碗和一双筷子');        }, 2000);    });    return p;}cook().then(eat, function(data){  console.log(data + '没法吃!');}) | 
运行结果如下:

| 
 1 
2 
3 
4 
 | 
cook().then(null, function(data){  console.log(data + '没法吃!');}) | 
3,catch()方法
(1)它可以和 then 的第二个参数一样,用来指定 reject 的回调
| 
 1 
2 
3 
4 
5 
 | 
cook().then(eat).catch(function(data){    console.log(data + '没法吃!');}); | 
(2)它的另一个作用是,当执行 resolve 的回调(也就是上面 then 中的第一个参数)时,如果抛出异常了(代码出错了),那么也不会报错卡死 js,而是会进到这个 catch 方法中。
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
 | 
//做饭function cook(){    console.log('开始做饭。');    var p = new Promise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('做饭完毕!');            resolve('鸡蛋炒饭');        }, 1000);    });    return p;}//吃饭function eat(data){    console.log('开始吃饭:' + data);    var p = new Promise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('吃饭完毕!');            resolve('一块碗和一双筷子');        }, 2000);    });    return p;}cook().then(function(data){    throw new Error('米饭被打翻了!');    eat(data);}).catch(function(data){    console.log(data);}); | 
运行结果如下:

| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
 | 
somePromise.then(function() { return a();}).catch(TypeError, function(e) { //If a is defined, will end up here because //it is a type error to reference property of undefined}).catch(ReferenceError, function(e) { //Will end up here if a wasn't defined at all}).catch(function(e) { //Generic catch-the rest, error wasn't TypeError nor //ReferenceError}); | 
4,all()方法
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
 | 
//切菜function cutUp(){    console.log('开始切菜。');    var p = new Promise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('切菜完毕!');            resolve('切好的菜');        }, 1000);    });    return p;}//烧水function boil(){    console.log('开始烧水。');    var p = new Promise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('烧水完毕!');            resolve('烧好的水');        }, 1000);    });    return p;}Promise.all([cutUp(), boil()]).then(function(results){    console.log("准备工作完毕:");    console.log(results);}); | 
(2)运行结果如下:

5,race()方法
| 
 1 
2 
3 
4 
5 
6 
 | 
Promise.race([cutUp(), boil()]).then(function(results){    console.log("准备工作完毕:");    console.log(results);}); | 

| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
 | 
//请求某个图片资源function requestImg(){    var p = new Promise(function(resolve, reject){    var img = new Image();    img.onload = function(){       resolve(img);    }    img.src = 'xxxxxx';    });    return p;}//延时函数,用于给请求计时function timeout(){    var p = new Promise(function(resolve, reject){        setTimeout(function(){            reject('图片请求超时');        }, 5000);    });    return p;}Promise.race([requestImg(), timeout()]).then(function(results){    console.log(results);}).catch(function(reason){    console.log(reason);}); | 
上面代码 requestImg 函数异步请求一张图片,timeout 函数是一个延时 5 秒的异步操作。我们将它们一起放在 race 中赛跑。
- 如果 5 秒内图片请求成功那么便进入 then 方法,执行正常的流程。
 - 如果 5 秒钟图片还未成功返回,那么则进入 catch,报“图片请求超时”的信息。
 

[转]JS - Promise使用详解2(ES6中的Promise)的更多相关文章
- Promise入门详解
		
异步调用 异步 JavaScript的执行环境是单线程. 所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它 ...
 - ES6,ES2105核心功能一览,js新特性详解
		
ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...
 - JS - Promise使用详解--摘抄笔记
		
第一部分: JS - Promise使用详解1(基本概念.使用优点) 一.promises相关概念 promises 的概念是由 CommonJS 小组的成员在 Promises/A 规范中提出来的. ...
 - Js apply方法与call方法详解 附ES6新写法
		
我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家 ...
 - es6的promise用法详解
		
es6的promise用法详解 promise 原理 promise是es6的异步编程解决方案, 是es6封装好的对象: 一个promise有三种状态:Pending(进行中).Resolved(已完 ...
 - 《Node.js开发实战详解》学习笔记
		
<Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
 - Js apply 方法 详解
		
Js apply方法详解 我在一开始看到JavaScript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...
 - Js apply()使用详解
		
Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...
 - Js apply方法详解,及其apply()方法的妙用
		
Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...
 - Vue.js 数据绑定语法详解
		
Vue.js 数据绑定语法详解 一.总结 一句话总结:Vue.js 的模板是基于 DOM 实现的.这意味着所有的 Vue.js 模板都是可解析的有效的 HTML,且通过一些特殊的特性做了增强.Vue ...
 
随机推荐
- git 列出两个分支 或者两个提交版本之间不同的文件名字
			
只列出名字 git diff remotes/origin/dev remotes/origin/master --name-only
 - Linux crontab命令参数和时间格式说明
			
crontab 是用来让使用者在固定时间或固定间隔执行程序之用 参数说明 选项 功能 -e 编辑crontab定时任务 -l 查询crontab任务 -r 删除当前用户所有的crontab任务 时间格 ...
 - 动态管理upsteam---nginx_http_dyups_module
			
nginx_http_dyups_module nginx_http_dyups_module是第三方开源软件,它提供API动态修改upstream的配置,并且支持Nginx的ip_hash.kee ...
 - Sql操作时间
			
--. 当前系统日期.时间 -- ::27.277 --.时间操作 dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值 dateadd(datepart,number,d ...
 - gcc分步骤编译的记录
 - 浅入不深出--vuex的简单使用
			
什么是vuex,官网的描述是:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.状态管理模式包含3个部分: 1.state,驱动应用的数据源: 2.view,以声明方式将state映射到 ...
 - 斜率优化板题 HDU 3507 Print Article
			
题目大意:输出N个数字a[N],输出的时候可以连续的输出,每连续输出一串,它的费用是 "这串数字和的平方加上一个常数M".n<=500000 我们设dp[i]表示输出到i的时 ...
 - lxml 和 pyquery 示例  爬  卡牌
			
import requests from pyquery import PyQuery as pq import json import jsonpath from lxml import etree ...
 - codeforcesC - Berry Jam(折半枚举+1-1序列前后缀和)
			
Educational Codeforces Round 78 (Rated for Div. 2) C - Berry Jam C. Berry Jam time limit per test 2 ...
 - Selenium ChromeDriver与Chrome版本映射表(更新到v77)
			
ChromeDriver版本 支持的Chrome版本 v77.0.3865.40 v77 v76.0.3809.126 v76 v75.0.3770.140 v75 v74 v74 v73 v73 v ...