博客列表 >ES6 Promise 对象简单了解

ES6 Promise 对象简单了解

Lon
Lon原创
2021年11月02日 14:54:20888浏览

ES6 Promise 对象简单了解

一、Promise 介绍

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

2.ES6 之前非常多层次嵌套的同步、异步,执行顺序混乱且不好维护,Promise 就很好的解决了这些问题;

二、Promise 创建

要想创建一个 promise 对象、可以使用 new 来调用 Promise 的构造器来进行实例化。

  1. const promise = new Promise((resolve, reject) => {
  2. //一顿异步操作之后
  3. if (false) {
  4. //console.log('异步成功!');
  5. resolve('异步成功!');
  6. } else {
  7. //console.log(('异步失败!'));
  8. reject('异步失败!');
  9. }
  10. });
  11. //then 方法可执行 resolve 的回调函数
  12. //catch 方法可执行 reject 的回调函数
  13. p.then((value) => {
  14. console.log(value);
  15. }).catch((reason) => {
  16. console.log((reason));
  17. });

注意:

Promise 构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。在回调中执行一些操作(例如异步),如果一切都正常,则调用 resolve,否则调用 reject。

对于已经实例化过的 promise 对象可以调用 promise.then() 方法,传递 resolve 和 reject 方法作为回调。

三、实例测试

我们做个模拟多层异步通信的实例测试,要异步多个内容,并按指定顺序执行;

先给出不进行 Promise 异步,看它执行的顺序

  1. //模拟异步1
  2. setTimeout(() => {
  3. console.log('异步1');
  4. }, 3500);
  5. //模拟异步2
  6. setTimeout(() => {
  7. console.log('异步2');
  8. }, 800);
  9. //模拟异步3
  10. setTimeout(() => {
  11. console.log('异步3');
  12. }, 1500);

这里不管怎么调节,最终输出结果总是:2,3,1。而需求顺序要:1,2,3;

传统解决办法—回调

  1. setTimeout(() => {
  2. console.log("1.异步");
  3. setTimeout(() => {
  4. console.log("2.异步");
  5. setTimeout(() => {
  6. console.log("3.异步");
  7. }, 3500)
  8. },800)
  9. },1500)

将上面模拟异步通信,通过 Promise 进行改装;

  1. let p1 = new Promise((resolve, reject) => {
  2. //模拟异步1
  3. setTimeout(() => {
  4. console.log('异步1');
  5. resolve('1.异步');
  6. }, 3500);
  7. });
  8. let p2 = new Promise((resolve, reject) => {
  9. //模拟异步2
  10. setTimeout(() => {
  11. console.log('异步2');
  12. resolve('2.异步');
  13. }, 800);
  14. });
  15. let p3 = new Promise((resolve, reject) => {
  16. //模拟异步3
  17. setTimeout(() => {
  18. console.log('异步3');
  19. resolve('3.异步');
  20. }, 1500);
  21. });
  22. p1.then(value => {
  23. console.log(value);
  24. //当 return 一个 Promise 对象的时候,后续的 then 中的 方法的第一个参数会作为 p2 的 resolve
  25. return p2;
  26. }).then(value => {
  27. console.log(value);
  28. return p3;
  29. }).then(value => {
  30. console.log(value);
  31. });

最终按需求顺序输出1,2,3

四、Promise.all方法

Promise.all 方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

  1. //var p = Promise.all([p1,p2,p3]);
  2. let p1 = new Promise((resolve, reject) => {
  3. //模拟异步1
  4. setTimeout(() => {
  5. //console.log('异步1');
  6. resolve('1.异步');
  7. }, 3500);
  8. });
  9. let p2 = new Promise((resolve, reject) => {
  10. //模拟异步2
  11. setTimeout(() => {
  12. //console.log('异步2');
  13. resolve('2.异步');
  14. }, 800);
  15. });
  16. let p3 = new Promise((resolve, reject) => {
  17. //模拟异步3
  18. setTimeout(() => {
  19. //console.log('异步3');
  20. resolve('3.异步');
  21. }, 1500);
  22. });
  23. let p = Promise.all([p1, p2, p3]);
  24. p.then(value => {
  25. console.log(value);
  26. });
  27. // ['1.异步', '2.异步', '3.异步']0: "1.异步"1: "2.异步"2: "3.异步"length: 3[[Prototype]]: Array(0)

五、Promise Ajax

  1. function ajax(url) {
  2. return new Promise(function (resolve, reject) {
  3. const req = new XMLHttpRequest();
  4. req.open('GET', url, true);
  5. req.onload = function () {
  6. if (req.status === 200) {
  7. resolve(req.responseText);
  8. } else {
  9. reject(new Error(req.statusText));
  10. }
  11. };
  12. req.onerror = function () {
  13. reject(new Error(req.statusText));
  14. };
  15. req.send();
  16. });
  17. }
  18. const url = "https://jsonplaceholder.typicode.com/users";
  19. ajax(url).then(value => document.write('返回的数据:' + value))
  20. .catch(error => document.write('错误:' + error))
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议