ES6---(3)Promise对象

x33g5p2x  于2021-09-24 转载在 其他  
字(3.1k)|赞(0)|评价(0)|浏览(544)

一、Promise对象介绍

ES6原生提供了Promise对象,它表示未来要发生的事件,相当于一个容器,保存着异步操作的一些结果。各种异步操作都可以用同样的方法进行处理。

特点:
  1. 对象的状态不受外界影响 处理异步操作 三个状态:Pending(进行) Resolved(成功) Rejected(失败)
  2. 一旦状态改变,就不会再次改变,任何时候都可以得到这个结果

二、基本使用

可以使用new来创建一个Promise对象的一个实例。

  1. let prom = new Promise(function(resolved, rejected) {}

Promise包含一个回调函数,有resolve和reject两个参数,如果函数在调用时执行操作正常,则会调用resolve,否则调用reject。

实例

  1. function timeOut(ms) {
  2. return new Promise((resolved, rejected) => {
  3. setTimeout(() => {
  4. resolved("success!!")
  5. }, ms);
  6. })
  7. }
  8. timeOut(2000).then((val) => {
  9. console.log(val);
  10. })

我们定义一个超时函数,返回一个Promise对象实例,然后我们调用它,.then()方法返回成功的返回值success。

三、用Promise封装Ajax

我们可以用promise封装一个类似于Ajax的函数。

  1. const getJSON = function(url) {
  2. // 返回一个promise对象
  3. return new Promise((Resolved, Rejected) => {
  4. const xhr = new XMLHttpRequest();
  5. // 打开网址
  6. xhr.open('GET', url);
  7. // 状态改变,调用函数
  8. xhr.onreadystatechange = handler;
  9. xhr.responseType = 'json';
  10. xhr.setRequestHeader("Accept", 'application/json');
  11. // 发送
  12. xhr.send();
  13. function handler() {
  14. // console.log(this.readyState);
  15. // console.log(this);
  16. if (this.readyState === 4) {
  17. if (this.status === 200) {
  18. Resolved(this.response);
  19. } else {
  20. Rejected(new Error(this.statusText));
  21. }
  22. }
  23. }
  24. })
  25. }
  26. getJSON("https://api.vvhan.com/api/weather?city=北京&type=week").then(
  27. (data) => {
  28. console.log(data);
  29. }, (error) => {
  30. console.log(error);
  31. }
  32. )

getJSON函数返回一个promise对象实例,在这里我们new一个请求数据的对象,然后判断状态改变(进行->成功 或者 进行->失败),调用handler函数根据状态码判断数据是否获取成功再返回相应内容。

.then().catch()链式编程

  1. // then() 方法
  2. // then() 第一个参数是resolved回调函数,第二个参数可选Rejected状态的回调函数
  3. // then() 返回一个新的Promise对象实例,因此可以采用链式编程,不过实际开发一般采用.catch()方法捕获异常
  4. // getJSON("https://api.vvhan.com/api/weather?city=北京&type=week").then(
  5. // (data) => {
  6. // console.log(data);
  7. // }).catch(err => {
  8. // console.log(err);
  9. // })
  10. // 这里等价于.then(null, err => {})

四、promise对象其他常用方法

1、resolve()方法

  1. // resolve() 将现有的任何对象转换成promise对象
  2. let p = Promise.resolve("foo");
  3. console.log(p);
  4. p.then(data => {
  5. console.log(data); // foo
  6. })

2、all()方法

应用:一些游戏类的素材比较多,等待图片、静态资源都加载完成才进行页面的初始化。
all()方法有一个数组作为参数,只有当数组内容状态全为成功才会被resolve,否则reject。

  1. let promise1 = new Promise((resolve, reject) => {});
  2. let promise2 = new Promise((resolve, reject) => {});
  3. let promise3 = new Promise((resolve, reject) => {});
  4. let p4 = Promise.all([promise1, promise2, promise3]);
  5. p4.then(() => {
  6. // 三个都成功才成功
  7. }).catch(err => {
  8. // 有一个失败则失败
  9. })

3、race()方法

Promise.race([p1,p2,p3])
当p1,p2,p3状态改变时,先返回状态改变完成的。

应用:给某个异步请求设置超时时间,并且在超时后执行相应的操作。
例如在请求一个图片资源时。

  1. function requestImg(imgSrc) {
  2. return new Promise((resolve, reject) => {
  3. const img = new Image();
  4. img.onload = function() {
  5. resolve(img);
  6. }
  7. img.src = imgSrc;
  8. })
  9. }
  10. function timeOut() {
  11. return new Promise((resolve, reject) => {
  12. setTimeout(() => {
  13. reject(new Error("图片请求超时"))
  14. }, 3000);
  15. })
  16. }
  17. let src = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fbpic.588ku.com%2Felement_origin_min_pic%2F16%2F10%2F29%2F2ac8e99273bc079e40a8dc079ca11b1f.jpg&refer=http%3A%2F%2Fbpic.588ku.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1634906070&t=c93ae1e0fdaf933291962dc5726bfb9b";
  18. Promise.race([requestImg(src), timeOut()]).then(res => {
  19. console.log(res);
  20. document.body.appendChild(res);
  21. }).catch(err => {
  22. console.log(err);
  23. })

图片是我随便百度的一张。当requestImg()函数成功获取图片后,返回该图片,把它渲染到页面上,否则就调用timeOut()函数扔出一个错误。
看效果:

下一篇:ES6—(4)async的用法

相关文章