[转]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 | //做饭functioncook(){    console.log('开始做饭。');    varp = newPromise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('做饭完毕!');            resolve('鸡蛋炒饭');        }, 1000);    });    returnp;}//吃饭functioneat(data){    console.log('开始吃饭:'+ data);    varp = newPromise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('吃饭完毕!');            resolve('一块碗和一双筷子');        }, 2000);    });    returnp;}functionwash(data){    console.log('开始洗碗:'+ data);    varp = newPromise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('洗碗完毕!');            resolve('干净的碗筷');        }, 2000);    });    returnp;} | 
(2)使用 then 链式调用这三个方法:
| 1 2 3 4 5 6 7 8 9 10 | cook().then(function(data){    returneat(data);}).then(function(data){    returnwash(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 | //做饭functioncook(){    console.log('开始做饭。');    varp = newPromise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('做饭失败!');            reject('烧焦的米饭');        }, 1000);    });    returnp;}//吃饭functioneat(data){    console.log('开始吃饭:'+ data);    varp = newPromise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('吃饭完毕!');            resolve('一块碗和一双筷子');        }, 2000);    });    returnp;}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 | //做饭functioncook(){    console.log('开始做饭。');    varp = newPromise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('做饭完毕!');            resolve('鸡蛋炒饭');        }, 1000);    });    returnp;}//吃饭functioneat(data){    console.log('开始吃饭:'+ data);    varp = newPromise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('吃饭完毕!');            resolve('一块碗和一双筷子');        }, 2000);    });    returnp;}cook().then(function(data){    thrownewError('米饭被打翻了!');    eat(data);}).catch(function(data){    console.log(data);}); | 
运行结果如下:

| 1 2 3 4 5 6 7 8 9 10 11 | somePromise.then(function() { returna();}).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 | //切菜functioncutUp(){    console.log('开始切菜。');    varp = newPromise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('切菜完毕!');            resolve('切好的菜');        }, 1000);    });    returnp;}//烧水functionboil(){    console.log('开始烧水。');    varp = newPromise(function(resolve, reject){        //做一些异步操作        setTimeout(function(){            console.log('烧水完毕!');            resolve('烧好的水');        }, 1000);    });    returnp;}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 | //请求某个图片资源functionrequestImg(){    varp = newPromise(function(resolve, reject){    varimg = newImage();    img.onload = function(){       resolve(img);    }    img.src = 'xxxxxx';    });    returnp;}//延时函数,用于给请求计时functiontimeout(){    varp = newPromise(function(resolve, reject){        setTimeout(function(){            reject('图片请求超时');        }, 5000);    });    returnp;}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 ... 
