ES6之Promise用法解析

以你之姓@ 2022-12-01 01:23 294阅读 0赞

一.Promise是什么

promise是一个对象,对象和函数的区别就是对象可以保存状态,函数不可以(闭包除外)
并未剥夺函数return的能力,因此无需层层传递callback,进行回调获取数据

  • 主要用于异步计算
  • 可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
  • 可以在对象之间传递和操作promise,帮助我们处理队列
  • 代码风格,容易理解,便于维护,多个异步等待合并便于解决

二.实例用法

1.简单用法
  1. new Promise(function(resolve, reject) {
  2. // 一段耗时的异步操作
  3. setTimeout(() => {
  4. if (Math.random() < 0.5) {
  5. resolve("处理成功");
  6. } else {
  7. reject("处理失败");
  8. }
  9. }, 500);
  10. }).then(
  11. res => {
  12. console.log(res);
  13. },
  14. err => {
  15. console.log(err);
  16. }
  17. );

运行结果

  1. 16:18:39 GMT+0800 (中国标准时间)0.4296734200327992
  2. 16:18:39 GMT+0800 (中国标准时间)处理成功
  3. 16:18:41 GMT+0800 (中国标准时间)0.8346405813826019
  4. 16:18:41 GMT+0800 (中国标准时间)处理失败
2.顺序执行
  1. new Promise(function(resolve, reject) {
  2. // 一段耗时的异步操作
  3. setTimeout(() => {
  4. var num = Math.random();
  5. console.log(new Date()+num);
  6. if (num < 0.5) {
  7. resolve("处理成功");
  8. } else {
  9. reject("处理失败");
  10. }
  11. }, 1000);
  12. })
  13. .then(
  14. res => {
  15. console.log(new Date()+res);
  16. return new Promise(resolve => {
  17. setTimeout(() => {
  18. resolve(new Date()+"success");
  19. }, 2000);
  20. });
  21. },
  22. err => {
  23. console.log(new Date()+err);
  24. return new Promise(resolve => {
  25. setTimeout(() => {
  26. resolve("err success");
  27. }, 3000);
  28. });
  29. }
  30. )
  31. .then(val => {
  32. console.log(new Date()+val);
  33. });

运行结果:

  1. 16:16:29 GMT+0800 (中国标准时间)0.6184486563566081
  2. 16:16:29 GMT+0800 (中国标准时间)处理失败
  3. 16:16:32 GMT+0800 (中国标准时间)err success
  4. 16:16:44 GMT+0800 (中国标准时间)0.06319989438930618
  5. 16:16:44 GMT+0800 (中国标准时间)处理成功
  6. 16:16:46 GMT+0800 (中国标准时间)
  7. 16:16:46 GMT+0800 (中国标准时间)success
  • resolve作用
    将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
  • reject作用是
    将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
  • promise作为队列最为重要的特性,我们在任何一个地方生成了一个promise队列之后,我们可以把他作为一个变量传递到其他地方。
3.并行执行
  1. //呼叫1
  2. function call1() {
  3. console.log(new Date() + "成员1已准备");
  4. return new Promise(function(resolve, reject) {
  5. //异步操作
  6. setTimeout(function() {
  7. var num = Math.random();
  8. console.log(new Date() + num);
  9. if (num < 0.5) {
  10. resolve("成员1呼叫成功");
  11. } else {
  12. reject("成员1呼叫失败");
  13. }
  14. }, 1000);
  15. });
  16. }
  17. //呼叫2
  18. function call2() {
  19. console.log(new Date() + "成员2已准备");
  20. return new Promise(function(resolve) {
  21. //异步操作
  22. setTimeout(function() {
  23. resolve("成员2呼叫成功");
  24. }, 2000);
  25. });
  26. }
  27. Promise.race([call1(), call2()]).then(
  28. res => {
  29. console.log(res);
  30. },
  31. err => {
  32. console.log('异常:'+err);
  33. }
  34. );
  35. // Promise.all([call1(), call2()]).then(
  36. // res => {
  37. // console.log(res);
  38. // },
  39. // err => {
  40. // console.log('异常:'+err);
  41. // }
  42. // );

Promise.race 结果:

  1. 16:43:21 GMT+0800 (中国标准时间)成员1已准备
  2. 16:43:21 GMT+0800 (中国标准时间)成员2已准备
  3. 16:43:22 GMT+0800 (中国标准时间)0.4569487452864329
  4. 16:43:22 GMT+0800 成员1呼叫成功

Promise.all 测试结果:

  1. 16:40:34 GMT+0800 (中国标准时间)成员1已准备
  2. 16:40:34 GMT+0800 (中国标准时间)成员2已准备
  3. 16:40:35 GMT+0800 (中国标准时间)0.9975951934891232
  4. 16:40:35 GMT+0800 异常:成员1呼叫失败
  5. 16:40:37 GMT+0800 (中国标准时间)成员1已准备
  6. 16:40:37 GMT+0800 (中国标准时间)成员2已准备
  7. 16:40:38 GMT+0800 (中国标准时间)0.023790745067002295
  8. 16:40:38 GMT+0800 ["成员1呼叫成功", "成员2呼叫成功"]
Promise.all
  • Promise.all([p1, p2, p3])用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise,它接收一个数组作为参数
  • 数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
  • 当所有的子Promise都完成,该Promise完成,返回值是全部值得数组
  • 有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果
Promise.all
  • Promise.race() 类似于Promise.all() ,区别在于它有任意一个完成就算完成

发表评论

表情:
评论列表 (有 0 条评论,294人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ES6 Promise用法总结

    1.什么是Promise Promise 是异步编程的一种解决方案,其实是一个构造函数,自己身上有all、reject、resolve这几个方法,原型上有then、catch

    相关 ES6Promise用法

    一.Promise是什么 promise是一个对象,对象和函数的区别就是对象可以保存状态,函数不可以(闭包除外) 并未剥夺函数return的能力,因此无需层层传递ca

    相关 ES6Promise

    ES6中为原生JS新增加了一个对象用来解决异步编程和问题,这个对象就是Promise。 那promise究竟是什么呢?这个真的是一件很难解释清楚的事情,他一共有三种状态,就像