1. 创建一个promise对象

var promise = new Promise(function(resolve, reject){
//异步处理
//处理结束后调用resolve或reject
});

2. 设置promise对象在resolve或reject后的回调函数,可以使用promise.then()方法:

promise.then(onFulfilled, onRejected);

onFulfilled和onRejected都是函数,这两个参数均为可选参数。resolve(成功)时,onFulfilled会被调用;reject(失败)时,onRejected会被调用。如果只想对成功的情况进行处理可以采用:

promise.then(onFulfilled);

如果只想对失败的情况进行处理,可以采用:

promise.then(undefined, onRejected);

这种方式只指定reject(失败)时的回调函数,不过这种情况下用catch是一种更好的选择:

promise.catch(onRejected);

3. Promise静态方法(类方法)

  Promise是一个构造函数,同时也是一个全局对象,Promise全局对象还拥有一些静态方法,或者说类方法(只能通过Promise调用,而不能通过Promise实例调用),比如Promise.all(),Promise.resolve()等。

4. Promise事例

function asyncFunction(){
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve("Async Hello World.")
}, 1600);
});
} asyncFunction().then(function(res){
console.log(res);
}).catch(function(error){
console.log(error);
});

执行asyncFunction()函数会返回一个promise对象,该promise对象会在setTimeout之后的1600ms后被resolve。我们可以将promise理解成一个期望,如果该期望调用了resolve()方法,这个期望就被实现了,愿望实现后则会触发该promise对象的then中的onFulfilled函数;同样的,如果该期望调用了reject()方法,这个期望就破灭了,期望破灭后则会触发该promsie对象的then中的onReject函数,或者catch中的onReject函数。

上面用了catch方法,当然也可以不实用catch,只使用then:

function asyncFunction(){
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve("Async Hello World.")
}, 1600);
});
} asyncFunction().then(function(res){
console.log(res);
}, function(error){
console.log(error);
});

5. Promise的状态

  用new Promise实例化的promise对象具有三种状态:Fulfilled,Rejected和Pending。promise对象的状态,从Pending跳转到Fulfilled或者Rejected后,这个promise对象的状态就不会再发生任何变化,也就是说在then中注册的回调函数可以肯定的说只会被调用一次。Fulfilled或者Rejected这两个中的任一状态都可以表示为Settled(不变的)。可见promise的状态跳转是非常简单易懂的。

6. 理解catch

  事实上,catch(onRejected)只是then(undefined, onRejected)的别名而已。一般来说使用catch将resolve和reject分开是比较推荐的做法。关于用then和catch的区别,看一下下面的代码:

function throwError(value) {
// 抛出异常
throw new Error(value);
}
// <1> onRejected不会被调用
function badMain(onRejected) {
return Promise.resolve(42).then(throwError, onRejected);
}
// <2> 有异常发生时onRejected会被调用
function goodMain(onRejected) {
return Promise.resolve(42).then(throwError).catch(onRejected);
}
// 运行示例
badMain(function(error){
console.log('bad' + error);
});
goodMain(function(error){
console.log('good' + error);
});

在上面的代码中badMain是一种不太好的实现方式,goodMain则是一种非常好的进行错误处理的版本。事实上,then和catch都会创建并返回一个新的promise对象。promise在方法链中增加一次处理的时候所操作的都是完全不同的promise对象。当然,犹豫catch是then的别名,我们使用then也可以完成同样的工作,只不过用catch意图更明确:

Promise.resolve(42).then(throwError).then(undefined, onRejected);

promise第一篇-简介的更多相关文章

  1. Python第一篇-简介和入门

    简介: Python[1]  (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第 ...

  2. spark第一篇--简介,应用场景和基本原理

    摘要: spark的优势:(1)图计算,迭代计算(2)交互式查询计算 spark特点:(1)分布式并行计算框架(2)内存计算,不仅数据加载到内存,中间结果也存储内存 为了满足挖掘分析与交互式实时查询的 ...

  3. hive第一篇----简介和使用客户端

    摘要by crazyhacking:•Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能.•本质是将SQL转换为MapReduce程序的映射 ...

  4. highcharts第一篇---简介和使用

    Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ...

  5. 分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置(单点安装)——第一篇

    分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置(单点安装)--第一篇 简介 首先简单了解一下基础概念,FastDFS是一个开源的轻量级分布式文件系统,由 ...

  6. SAP-ABAP系列 第一篇SAP简介

    第一篇 SAP简介 SAP全名为System Application and Products in Data Processing.SAP目前是全世界排名第一的RP软件,号称“全球最大的企业管理解决 ...

  7. 【ABAP系列】SAP ABAP7.40新语法简介第一篇

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP7.40新语法简 ...

  8. 第一篇 Replication:复制简介

    本篇文章是SQL Server Replication系列的第一篇,详细内容请参考原文. 复制这个词来自拉丁语中的"replicare",意味着重复.Replication des ...

  9. 【译】第一篇 Replication:复制简介

    本篇文章是SQL Server Replication系列的第一篇,详细内容请参考原文. 复制这个词来自拉丁语中的"replicare",意味着重复.Replication des ...

随机推荐

  1. 数据处理项目Postmortem

    数据处理项目Postmortem 1. 设想和目标 1)目标我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的项目是学霸系统PipeLine,软件主要解决学霸系 ...

  2. 个人项目junit4测试

    一.题目简介 用java编写一个程序,模拟ATM柜员机. 二.源码的github链接 www.github.com/liuxianchen/test 三.所设计的模块测试用例.测试结果截图 四  心得 ...

  3. angular生命周期

    概述 angular的组件及指令都有相应的声明周期: 创建, 更新, 销毁, 我们可以通过实现相应的生命周期钩子接口来进入相应的该声明周期的关键时刻 组件生命周期顺序 ngOnChanges: 当组件 ...

  4. 关于封装了gevent的request grequest库的使用与讨论

    最近迷上了gevent所以研究很多gevent相关的东西. 但是我现在不想写相关gevent和greenlet的东西.因为这一块内容实在太多太大太杂,我自己也还没有完全弄明白,所以等我完全搞清楚测试也 ...

  5. 微信小程序入門學習資料鏈接

    https://blog.csdn.net/github_38847071/article/details/73250258 https://blog.csdn.net/lily2016n/artic ...

  6. Java之Logger日志(Java8特性)

    import java.util.logging.Level; import java.util.logging.Logger; public class LoggingDemo { public s ...

  7. IPv6应用普及,任重而道远

    导读 2018年初开始,全国尤其是运营商网络开启了IPv6改造的大幕,很多企业都从工信部领到了军令状,要将IPv6改造工作彻底落实下去.现在2018年已接近尾声,回头看看实际部署情况如何. IPv6涉 ...

  8. Codeforces965E Short Code 【启发式合并】【堆】

    题目大意: 给出总长度不超过1E+5的不重复字符串集,给每个字符串选一个前缀使得可以区分它. 题目分析: KAN出的DIV2难度一般不高,想升Ranting的可以试试. 简单的树上启发式合并,建出Tr ...

  9. RedIsGood TopCoder - 9915(概率dp)

    ---恢复内容开始--- 论文题: 桌面上有 R 张红牌和 B 张黑牌,随机打乱顺序后放在桌面上,开始一张一张 地翻牌,翻到红牌得到 1 美元,黑牌则付出 1 美元.可以随时停止翻牌,在最优策略下平均 ...

  10. bzoj 2141 : 排队 (cdq分治+bit)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2141 思路: 其实就是求动态逆序对...cdq降维,用树状数组前后求两遍逆序对就好了 切水 ...