Promise的基本使用及方法

Promise

pormise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。
传统的异步编程

setTimeout(()=>{
	setTimeout(()=>{
		setTimeout(()=>{
			
		})
	})
})

回调函数的优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),流程会很混乱,而且每个任务只能指定一个回调函数。

promise编程
promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。…
promise有2个特点:

  • 对象的状态不受外界影响。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。

基本用法

在promise中接收2个回调函数:resolve(成功的回调)和reject(失败的回调)。一般用于在异步代码执行成功后执行resolve,否则执行reject

const promise = new Promise(function(resolve, reject) {
  // ... some code

  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});
例如:用Promise对象实现的 Ajax 操作的例子

```javascript
//封装一个getJSON函数,接收一个url,返回一个promise
const getJSON = function(url) {
  const promise = new Promise(function(resolve, reject){
  //handler方法,判断请求成功还是失败
    const handler = function() {
      if (this.readyState !== 4) {
        return;
      }
      if (this.status === 200) {
      //请求成功执行resolve并将数据传入
        resolve(this.response);
      } else {
      //请求失败执行reject并返回失败的信息
        reject(new Error(this.statusText));
      }
    };
    const client = new XMLHttpRequest();
    client.open("GET", url);
    client.onreadystatechange = handler;
    client.responseType = "json";
    client.setRequestHeader("Accept", "application/json");
    client.send();

  });

  return promise;
};

getJSON("/posts.json").then(function(json) {
//接收到成功的数据json
  console.log('Contents: ' + json);
}, function(error) {
//接收到失败的信息
  console.error('出错了', error);
});

Promise的方法

1.Promise.prototype.then()

then方法有2个参数,第一个是成功的回调,第二个是失败的回调,then方法会返回一个新的Promise实例,所以可以进行链式调用,并且then方法接收的是成功还是失败可以通过上一个Promise的状态判断。

let a = new Promise((resolve,reject)=>{
        resolve(2)
    })
    let b = a.then(a=>{
    	//改变后面then方法的状态
        return Promise.reject(a)
    })
    b.then(_=>{},c=>{
    	//在rejcet的回调中接收到上一个then方法的返回值
        console.log(c)	//2
    })
2.Promise.prototype.catch()

cathc方法是在发生错误时执行,接收回调函数,回调函数接收一个错误信息

3.Promise.prototype.finally()

finally()方法是无论Promise的状态是成功还是失败都会执行,接收一个回调函数。

4.Promise.all()

all()方法是将多个Promise包装成一个新的Promise实例,接收一个数组,数组成员即是每个Promise实例,接收参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。
该方法只有在每个Promise返回成功状态后才会返回成功的状态,返回的参数也是一个数组,数组成员即是每个Pormise实例的返回值,否则有一个Promise实例返回失败的状态,那么包装后的Promise也会返回一个失败的状态,返回的参数是第一个返回失败状态的Promise的返回值。

4.Promise.race()

race()类似all()方法,区别是包装的Promise的状态由第一个改变的被包装的Promise决定,返回值也是第一个改变状态的Promise的返回值。

5.Promise.allSettled()

allSettled()方法类似all()方法,区别是被包装的Promise无论返回成功还是失败,该方法都会接收。

6.Promise.any()

any方法类似all()方法,区别是功能完全相反,any()方法只有所以的被包装Promise返回失败,包装的Promise才会失败,否则就成功。

7.Promise.resolve()

resolve()方法不接受参数则直接返回一个成功状态的Promise,接收参数则将参数转化为一个新的Promise对象。

8.Promise.reject()

reject()方法不接受参数则直接返回一个失败的Promise,接收参数则将参数转化为一个新的Promise对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值