• promise的基本用法


    Promise

    Promise 就是为了解决“回调地狱”问题的,它可以将异步操作的处理变得很优雅。

    Promise 可以支持多个并发的请求,获取并发请求中的数据这个 Promise 可以解决异步的问题,本身不能说 Promise 是异步的

    定义: 包含异步操作结果的对象

    状态:

    • pending:[待定]初始状态
    • fulfilled:[实现]操作成功
    • rejected: [被否决]操作失败

    注意:

    • Promise 会根据状态来确定执行哪个方法
    • Promise 实例化时状态默认为 pending 的,如异步状态异常rejected,反之fulfilled
    • 状态转化是单向的,不可逆转,已经确定的状态(fulfilled/rejected)无法转回初始状态(pending),而且只能是从 pending 到 fulfilled 或者 rejected

    基本用法

    1. //普通定义
    2. let ajax = (callback) => {
    3. console.log('≈')
    4. setTimeout(() => {
    5. callback && callback.call();
    6. }, 1000)
    7. }
    8. ajax(() => {
    9. console.log('timeout')
    10. })
    11. // 先会打出 开始执行,1s 后打出 timeout
    12. //Promise
    13. let ajax = () => {
    14. console.log("开始执行");
    15. return new Promise((resolve, reject) => {
    16. setTimeout(() => {
    17. resolve();
    18. }, 1000);
    19. });
    20. };
    21. ajax().then(() => {
    22. console.log("timeout");
    23. });
    24. // 先会打出 开始执行,1s 后打出 timeout
    25. // then()
    26. let ajax = () => {
    27. console.log("开始执行");
    28. return new Promise((resolve, reject) => {
    29. setTimeout(() => {
    30. resolve();
    31. }, 1000);
    32. });
    33. };
    34. ajax()
    35. .then(() => {
    36. return new Promise((resolve, reject) => {
    37. setTimeout(() => {
    38. resolve();
    39. }, 2000);
    40. });
    41. })
    42. .then(() => {
    43. console.log("timeout")
    44. })
    45. // 先会打出 开始执行,3s(1+2) 后打出 timeout
    46. // catch()
    47. let ajax = (num) => {
    48. console.log("开始执行");
    49. return new Promise((resolve, reject) => {
    50. if (num > 5) {
    51. resolve();
    52. } else {
    53. throw new Error("出错了");
    54. }
    55. });
    56. };
    57. ajax(6)
    58. .then(function () {
    59. console.log("timeout"); // 先会打出 开始执行,1s 后打出 timeout
    60. })
    61. .catch(function (err) {
    62. console.log("catch", err);
    63. });
    64. ajax(3)
    65. .then(function () {
    66. console.log("timeout");
    67. })
    68. .catch(function (err) {
    69. console.log("catch"); // 先会打出 开始执行,1s 后打出 catch
    70. });
    71. 复制代码

    Promise.all() 批量操作

    • Promise.all(arr)用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise
    • 它接收一个数组作为参数
    • 数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
    • 当所有的子Promise都完成,该Promise完成,返回值是全部值得数组
    • 有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果
    1. //所有图片加载完成后添加到页面
    2. const loadImg = (src) => {
    3. return new Promise(resolve, reject) => {
    4. let img = document.createElement("img");
    5. img.src = src;
    6. img.onload = function () {
    7. resolve(img);
    8. };
    9. img.onerror = function (err) {
    10. reject(err);
    11. };
    12. });
    13. }
    14. const showImgs = (imgs) => {
    15. imgs.forEach((img) => {
    16. document.body.appendChild(img);
    17. })
    18. }
    19. Promise.all([
    20. loadImg("https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg"),
    21. loadImg("https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg"),
    22. loadImg("https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg"),
    23. ]).then(showImgs);
    24. 复制代码

    Promise.race()

    • race 与 all相似,只不过只要有一个执行完就会执行
    1. //有一个执行完就回加载到页面
    2. const loadImg = (src) => {
    3. return new Promise(resolve, reject) => {
    4. let img = document.createElement("img");
    5. img.src = src;
    6. img.onload = function () {
    7. resolve(img);
    8. };
    9. img.onerror = function (err) {
    10. reject(err);
    11. };
    12. });
    13. }
    14. const showImgs = (imgs) => {
    15. let p = document.createElement("p");
    16. p.appendChild(img);
    17. document.body.appendChild(p);
    18. }
    19. Promise.race([
    20. loadImg("https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg"),
    21. loadImg("https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg"),
    22. loadImg("https://ss0.baidu.com/7Po3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg"),
    23. ]).then(showImgs);
    24. 复制代码

    Promise的问题

    • 一旦执行,无法中途取消,链式调用多个then中间不能随便跳出来
    • 错误无法在外部被捕捉到,只能在内部进行预判处理,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部
    • Promise内部如何执行,监测起来很难,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
  • 相关阅读:
    ChainSafe跨链桥部署教程
    解锁电力安全密码:迅软DSE助您保护机密无忧
    深度卷积神经网络的整体运行流程(以alexnet为例)
    【从部署服务器到安装autodock vina】
    git使用
    K8S基础笔记
    在k8s中通过CoreDNS进行域名解析的其中三种方法
    vue 手写手动轮播 且图片宽度不一样
    WebGPU的计算着色器实现冒泡排序
    Web 应用程序安全测试指南
  • 原文地址:https://blog.csdn.net/qq_43237014/article/details/126875684