ggggxc学习笔记----ES6学习笔记VI----Promise

十二、Promise

介绍:Promise是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Promise对象。所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。

Promise构造函数接受一个函数作为参数,包含一个参数和一个带有resolve(解析)reject(拒绝)两个参数的回调。它们是两个函数,由JavaScript引擎提供。Promise对象代表一个异步操作有三种状态: pending(进行中)fulfilled (已成功)rejected(已失败)。状态发生改变之后就凝固了,不会再变了,会一直保持这个结果,这时就称为resolved(已定型)。

const promise = new Promise(function(resolve, reject){ //... 
if(/*异步操作成功*/){
resolve(value);
//pending -> fulfilled
}else {
reject(error);  // pending -> rejected
}
});

一、实例方法:定义在Promise.prototype中的方法,通过Promise实例可以直接调用。

1.promise.prototype.then()—>是最常用的方法(链式操作):当状态由pending变为fulfilled的时候执行该回调函数。

参数:回调函数,回调函数的参数为resolve函数传递过来的值

返回值:返回一个新的Promise实例对象,因此可以使用链式调用。

2.Promise.prototype.catch()—>捕捉错误:当状态由pending变为rejected的时候执行该回调函数。

参数:回调函数,回调函数的参数为reject函数传递过来的值。

返回值:返回一个新的Promise实例对象,因此可以使用链式调用。

3.Promise.prototype.finally():当状态由pending变为fulfilled或者rejected的时候都执行该回调函数。

参数:回调函数

返回值:返回一个新的Promise实例对象

二、静态方法定义在Promise中的方法,通过Promise可以直接调用

1.Promise.all([p1,p2,p3]):用于将多个Promise 实例,包装成一个新的 Promise 实例。

参数:数组,数组中的元素为Promise实例

注意:Promise.all 方法的参数不一定是数组,但是必须具有 iterator 接口,且返回的每个成员都是 Promise 实例

返回值:Promise实例,当p1,p2,p3状态都为fulfilled时候,该实例的状态才为fulfilled,此时p1,p2,p3的返回值组成一个数组,传递给该实例的回调函数;只要p1,p2,p3的返回值有一个变为rejected,该实例状态为rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

例:

var p = Promise.all([p1,p2,p3]);
// 生成一个Promise对象的数组
var promises = [2, 3, 5, 7, 11, 13].map(function(id){
  return getJSON("/post/" + id + ".json");
});
Promise.all(promises).then(function(posts) {
  // ...  
}).catch(function(reason){
  // ...
});

 

2.Promise.race([p1,p2]):同样用于将多个Promise 实例,包装成一个新的Promise实例。

参数:数组,数组中的元素为Promise实例

返回值:Promise实例,当p1,p2之中有一个实例率先改变状态,该实例的状态就跟着改变。那个率先改变的Promise实例的返回值,就传递给该实例的回调函数。

3.Promise.any([p1,p2]):用于将多个Promise 实例,包装成一个新的Promise 实例,

参数:数组,数组中的元素为Promise实例

返回值:Promise实例,只要p1,p2状态有一个变为fulfilled,该实例的状态为fulflled; p1,p2状态都变为rejected,该实例状态才为rejected

4.Promise.resolve():用于将现有对象转化为Promise实例

参数:任意值。如果 Promise.resolve 方法的参数,不是具有 then 方法的对象,则返回一个新的 Promise 对象,且它的状态为fulfilled。

例:

var p = Promise.resolve('Hello');
p.then(function (s){
  console.log(s);   // Hello
});

 

      该代码表示生成一个新的Promise对象的实例p,它的状态为fulfilled,所以回调函数会立即执行,Promise.resolve方法的参数就是回调函数的参数。

5.Promise.reject(reason):返回一个新的Promise 实例,该实例的状态为rejected。

参数:错误信息。Promise.reject方法的参数reason,会被传递给实例的回调函数。

例:

var p = Promise.reject('出错了');
p.then(null, function (s){
  console.log(s);     // 出错了
}); 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gaoxiaochan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值