[转]JS - Promise使用详解1(基本概念、使用优点)
一、promises相关概念
1,then()方法介绍
- 成功回调
- 失败回调
- 前进回调(规范没有要求包括前进回调的实现,但是很多都实现了)。
2,Promise对象状态
- Pending(进行中、未完成的)
- Resolved(已完成,又称 Fulfilled)
- Rejected(已失败)。
3,Promise/A规范图解
4,目前支持Promises/A规范的库
- Q:可以在NodeJS 以及浏览器上工作,与jQuery兼容,可以通过消息传递远程对象。
- RSVP.js:一个轻量级的库,它提供了组织异步代码的工具。
- when.js:体积小巧,使用方便。
- NodeJS的Promise
- jQuery 1.5:据说是基于“CommonJS Promises/A”规范
- WinJS / Windows 8 / Metro
二、使用promises的优势
1,解决回调地狱(Callback Hell)问题
1
2
3
4
5
6
7
8
9
10
11
12
|
firstAsync( function (data){ //处理得到的 data 数据 //.... secondAsync( function (data2){ //处理得到的 data2 数据 //.... thirdAsync( function (data3){ //处理得到的 data3 数据 //.... }); }); }); |
(2)如果使用 promises 的话,代码就会变得扁平且更可读了。前面提到 then 返回了一个 promise,因此我们可以将 then 的调用不停地串连起来。其中 then 返回的 promise 装载了由调用返回的值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
firstAsync() .then( function (data){ //处理得到的 data 数据 //.... return secondAsync(); }) .then( function (data2){ //处理得到的 data2 数据 //.... return thirdAsync(); }) .then( function (data3){ //处理得到的 data3 数据 //.... }); |
2,更好地进行错误捕获
(1)比如下面代码我们使用 setTimeout 模拟异步操作,在其中抛出了个异常。但由于异步回调中,回调函数的执行栈与原函数分离开,导致外部无法抓住异常。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
function fetch(callback) { setTimeout(() => { throw Error( '请求失败' ) }, 2000) } try { fetch(() => { console.log( '请求处理' ) // 永远不会执行 }) } catch (error) { console.log( '触发异常' , error) // 永远不会执行 } // 程序崩溃 // Uncaught Error: 请求失败 |
(2)如果使用 promises 的话,通过 reject 方法把 Promise 的状态置为 rejected,这样我们在 then 中就能捕捉到,然后执行“失败”情况的回调。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
function fetch(callback) { return new Promise((resolve, reject) => { setTimeout(() => { reject( '请求失败' ); }, 2000) }) } fetch() .then( function (data){ console.log( '请求处理' ); console.log(data); }, function (reason, data){ console.log( '触发异常' ); console.log(reason); } ); |
当然我们在 catch 方法中处理 reject 回调也是可以的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
function fetch(callback) { return new Promise((resolve, reject) => { setTimeout(() => { reject( '请求失败' ); }, 2000) }) } fetch() .then( function (data){ console.log( '请求处理' ); console.log(data); } ) . catch ( function (reason){ console.log( '触发异常' ); console.log(reason); }); |
原文出自:www.hangge.com 转载请保留原文链接:https://www.hangge.com/blog/cache/detail_1635.html
[转]JS - Promise使用详解1(基本概念、使用优点)的更多相关文章
- JS - Promise使用详解--摘抄笔记
第一部分: JS - Promise使用详解1(基本概念.使用优点) 一.promises相关概念 promises 的概念是由 CommonJS 小组的成员在 Promises/A 规范中提出来的. ...
- [转]JS - Promise使用详解2(ES6中的Promise)
原文地址:https://www.hangge.com/blog/cache/detail_1638.html 2015年6月, ES2015(即 ECMAScript 6.ES6) 正式发布.其中 ...
- JS - Promise使用详解
参考:https://www.cnblogs.com/developer-ios/p/10510564.html
- ES6,ES2105核心功能一览,js新特性详解
ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...
- 《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 ...
随机推荐
- The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone 。
The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone. 今天有Mys ...
- SpringBoot2.x应用启动、关闭shell脚本
本篇主要说明以下内容: 1.SpringBoot2.x应用启动.关闭的shell脚本 1 启动脚本 直接放到同jar包同一个目录下,如下: #!/usr/bin/env bash APPLICATIO ...
- idea导入mybatis源码
1.最近在学mybatis,想下载源码导入idea结果网上一查没有一篇完整的,结果让我进了个大坑,算了,废话少说 2.两种办法,一个是git客户端克隆,另外一个是下载code压缩包.先说通过git客户 ...
- jmeter 实现登录参数化
业务场景 在测试过程中,一般需要模拟不同的用户登录,这样压测的数据比较平均,也能更好的模拟真实的压力情况. 如果使用同一个用户账号进行测试,那么比如在查询代办的时候,此人的待办太多,也不符合实际的情况 ...
- vector Construct
#include<vector> #include<iostream> using namespace std; void Test(); void main() { ,,,, ...
- try catch 小结 , node的回调callback里不能捕获异常 , 不能被v8优化(现在能了),
<深入浅出Nodejs>时,在第四章 - 异步编程中作者朴灵曾提到,异步编程的难点之一是异常处理,书中描述"尝试对异步方法进行try/catch操作只能捕获当次事件循环内的异常, ...
- vo bo po dao pojo dto
Recommended for you: Get network issues from WhatsUp Gold. Not end users. DAO: Data access object d ...
- yugabyte与cockroachdb 的几个区别
下图是来自官方文档 说明 今天打算尝试使用yugabyte做为hasura graphql-engine 的pg 引擎,发现比较完美,仔细看官方文档,原来yugabyte 底层实现直接是基于原生pg ...
- rsync同步备份
一.服务器端.备份客户端安装 rsync 服务. 1.环境: CentOS 主 IP:172.16.3.18 备 IP:172.16.3.19 2.安装 rsync 软件 #yum install r ...
- ABP 基本操作
基本信息: 官网:https://aspnetboilerplate.com api:https://aspnetboilerplate.com/Pages/Documents/Articles-Tu ...