博主信息
博文 33
粉丝 0
评论 0
访问量 64050
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
ES6 Promise 对象简单了解
Lon
原创
1589人浏览过

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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学