前端Promise理解

这篇具有很好参考价值的文章主要介绍了前端Promise理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

  1. 阐述promsie的基本概念
  2. 介绍实例方法then、catch、finally
  3. 介绍静态方法all、allSettled、race、any、resolve、reject

一、基础概念

  1. 执行器executor
    ◐ 当通过new创建Promise对象时,需要传入一个回调函数,称之为executor
    executor会在new promise时会被立即执行,并且可传入另外两个回调函数resolvereject
    ◐ 当调用resolve回调函数时,会执行Promise对象的then方法传入的回调函数
    ◐ 当调用reject回调函数时,会执行Promise对象的catch方法传入的回调函数

  2. 一个 Promise 必然处于以下几种状态之一
    ◐ 待定(pending):初始状态,既没有被兑现,也没有被拒绝
    ◐ 已兑现(fulfilled):意味着操作成功完成
    ◐ 已拒绝(rejected):意味着操作失败
    如果一个 Promise 已经被兑现或拒绝,即不再处于待定状态,那么则称之为已敲定(settled),且此时该Promise的状态是不可更改的

  3. 使用setTimeout模拟异步返回结果

    // 调用resolve触发fulfilled
    // 打印结果 22 11 'fulfilled'
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(11);
        console.log(22);
      }, 500);
    })
      .then((res) => console.log(res, "fulfilled"))
      .catch((err) => console.log(err, "rejected"));
     
    // 调用reject触发rejected
    // 打印结果  error rejected
    new Promise((resolve, reject) => {
      setTimeout(() => {
        reject('error');
      }, 500);
    })
      .then((res) => console.log(res, "fulfilled"))
      .catch((err) => console.log(err, "rejected"));
    

二、实例方法then、catch、finally

  1. then方法
    ◐ 入参.then(fulfilled回调, rejected回调)

    new Promise((resolve, reject) => {}).then(
       (res) => {
        console.log(res);
      },
      (err) => {
        console.log(err);
      }
    )
    // 以上代码等同于
    new Promise((resolve, reject) => {})
      .then((res) => {
        console.log(res);
      })
      .catch((err) => {
        console.log(err);
      });
    

    ◐ 返回值promise的状态
    a. 回调函数本身在执行时,处于pending状态
    b. 返回一个结果时,处于fulfilled状态,且返回的值将作为参数继续传递
    注:返回结果是一个Promise时,新Promise的状态会决定then返回Promise的状态
    c. 抛出一个异常时,它处于rejected状态

    例子一:

    	new Promise((resolve, reject) => {
    	  resolve(11);
    	})
    	  .then((res) => {
    	    console.log(res);  // 11
    	    return 22;
    	  })
    	  .then((res) => {
    	    console.log(res); // 22
    	    return Promise.resolve(33);
    	  })
    	  .then((res) => {
    	    console.log(res); // 33
    	  })
    	  // 没有返回任何值:将以 undefined 作为其兑现值
    	  .then((res) => {
    	    console.log(res); // undefined
    	  });
    

    例子二:

    	new Promise((resolve, reject) => {
    	  resolve(11);
    	})
    	  .then((res) => {
    	    console.log(res); // 11
    	    return 22;
    	  })
    	  .then((res) => {
    	    console.log(res); // 22
    	    throw new Error("错误");
    	  })
    	  .then((res) => {
    	    console.log(res);
    	  })
    	  .catch((err) => {
    	    console.log(err); // 错误对象
    	  });
    
    
  2. catch方法
    ◐ 入参.catch(rejected回调)

    	new Promise((reslve, reject) => {
    	  reject("error");
    	}).catch((err) => {
    	  console.log(err);
    	});
    

    ◐ 返回值promise的状态 *同then一致*

    例子一:

    	// .catch链式接收时仅能获取到上一次reject的值
    	new Promise((reslve, reject) => {
    		reject("error");
    	})
    	  .catch((err) => {
    	    console.log(err);  // error
    	    return Promise.reject(11);
    	  })
    	  .catch((res) => {
    	    console.log(res); // 11
    	  })
    	  .catch((res) => {
    	    console.log(res);
    	  });
    

    例子二:

    	new Promise((reslve, reject) => {
    	  reject("error");
    	})
    	  .catch((err) => {
    	    console.log(1, err); // 1 'error'
    	    return Promise.reject(11);
    	  })
    	  .catch((err) => {
    	    console.log(2, err); // 2 11
    	    return 22;
    	  })
    	  .catch((err) => {
    	    console.log(3, err);
    	  })
    	  .then((res) => {
    	    console.log(4, res); // 4 22
    	  })
    	  .catch((err) => {
    	    console.log(5, err);
    	  })
    	  .then((res) => {
    	    console.log(6, res); // 6 undefined
    	  });
    
    
  3. finally方法
    ◐ 入参.finally(回调)
    注:Promise对象无论变成fulfilled还是reject状态,最终都会被执行的代码

    	new Promise((resolve, reject) => {
    	  resolve(11);
    	})
    	  .finally(() => {
    	    console.log('finally11');
    	  })
    

    ◐ 返回值promise
    注:返回等效的 Promise。如果处理程序抛出错误或返回被拒绝的 promise,那么 finally() 返回的 promise 将以该值被拒绝。否则,处理程序的返回值不会影响原始 promise 的状态

    	new Promise((resolve, reject) => {
    	  resolve(11);
    	})
    	  .finally(() => {
    	    console.log("finally11"); // finally11
    	  })
    	  .finally(() => {
    	    console.log("finally22"); // finally22
    	  })
    	  .then((res) => {
    	    console.log(res); // 11
    	  });
    

三、静态方法all、allSettled、race、any、resolve、reject

  1. all方法
    a. 将多个promise包裹在一起形成一个新的Promise
    b. 新的promise状态由所有promise共同决定

    • 所有的promise状态变成fulfilled时,新的promise状态为fulfilled,并且会将所有promise的返回值组成一个数组

      const p1 = new Promise((resolve, reject) => resolve(11));
      const p2 = new Promise((resolve, reject) => resolve());
      const p3 = new Promise((resolve, reject) => resolve(33));
      Promise.all([p1, p2, p3]).then((res) => console.log(res)); // [11, undefined, 33]
      
    • 当有一个promise状态为rejected时,新的promise状态为rejected,并且会将第一个rejected的返回值作为参数

      const p1 = new Promise((resolve, reject) => resolve(11));
      const p2 = new Promise((resolve, reject) => reject("错误1"));
      const p3 = new Promise((resolve, reject) => reject("错误2"));
      Promise.all([p1, p2, p3])
        .then((res) => console.log(res))
        .catch((err) => console.log("error", err)); // error 错误1
      
  2. allSettled方法
    a. 该方法会在所有的promise都有结果(settled)(fulfilled、rejected)时,会触发最终调用;
    b. 新promise的结果一定是fulfilled的
    c. 与all相比较

    • 如何触发新promise最终状态为fulfilled,all在所有promise结果为fulfilled时触发,allSettled在所有的promise结果为fulfilled、rejected时触发
    • all新promise状态有fulfilled、rejected,allSettled新promise**状态只有fulfilled
    • 新promise状态为fulfilled时,all为一个存储所有promise返回值的数组([11, 22, 33]),allSettled为一个存储所有promise返回值包装成对象的数组([{status: ‘fulfilled’, value: 11},{status: ‘fulfilled’, value: undefined, {status: ‘fulfilled’, value: 22}}])
	const p1 = new Promise((resolve, reject) => resolve(11));
	const p2 = new Promise((resolve, reject) => reject("错误1"));
	const p3 = new Promise((resolve, reject) => resolve(22));
	Promise.allSettled([p1, p2, p3])
	  .then((res) => console.log(res));
	======打印结果见下
	[
	 {
	    status: "fulfilled",
	    value: 11,
	  },
	  {
	    status: "rejected",
	    reason: "错误1",
	  },
	  {
	    status: "fulfilled",
	    value: 22,
	  },
	]
  1. race、any方法

    • race 传入promise可迭代对象,返回一个promise。
      一旦有一个 promise状态已敲定(fulfilled、rejected),它就会立即返回。

      	function sleep(time, value, state) {
      	  return new Promise((resolve, reject) => {
      	    setTimeout(() => {
      	      if (state === "兑现") {
      	        return resolve(value);
      	      } else {
      	        return reject(new Error(value));
      	      }
      	    }, time);
      	  });
      	}
      	const p1 = sleep(500, 11, "兑现");
      	const p2 = sleep(100, 22, "兑现");
      	// 返回首个已兑现的p2
      	Promise.race([p1, p2])
      	  .then((res) => console.log(res)) // 22
      	  .catch((err) => console.log("error", err));
      
      	const p3 = sleep(500, 11, "兑现");
      	const p4 = sleep(100, 22, "拒绝"); 
      	// 返回首个已拒绝的p4
      	Promise.race([p3, p4])
      	  .then((res) => console.log(res))
      	  .catch((err) => console.log("error", err)); // error Error: 22
      	// 传入空 - 则返回的promise永远处于pending状态,不会有输出
      	Promise.race([])
      	  .then((res) => console.log(res))
      	  .catch((err) => console.log("error", err));
      
    • any 传入promise可迭代对象,返回一个promise。
      一旦有一个 promise状态已兑现(fulfilled),它就会立即返回。
      所有promise状态已拒绝(rejected),将使用AggregateError进行拒绝

      // 返回首个已兑现
      const p1 = new Promise((resolve, reject) => reject("错误1"));
      const p2 = new Promise((resolve, reject) => resolve(11));
      const p3 = new Promise((resolve, reject) => resolve(22));
      Promise.any([p1, p2, p3])
        .then((res) => console.log(res)) // 11
        .catch((err) => console.log("error", err));
      
      // 全未兑现
      const p1 = new Promise((resolve, reject) => reject("错误1"));
      const p2 = new Promise((resolve, reject) => reject("错误2"));
      const p3 = new Promise((resolve, reject) => reject("错误3"));
      Promise.any([p1, p2, p3])
        .then((res) => console.log(res))
        .catch((err) => console.log("error", err)); // error AggregateError: All promises were rejected
      // 传入空
        Promise.any([])
        .then((res) => console.log(res))
        .catch((err) => console.log("error", err)); // error AggregateError: All promises were rejected
      
  2. resolve、reject方法
    a. 直接调用静态方法resolve将promise状态更改为已兑现(fulfilled
    Promise.resolve(1) 等同于 new Promise((resolve)=>resolve(1))

      new Promise((resolve)=>resolve(11)).then((res) => console.log(res)) // 11
      Promise.resolve(22).then((res) => console.log(res)) // 22
    

    b. 直接调用静态方法reject将promise状态更改为已拒绝(rejected
    Promise.reject(1) === new Promise((resolve, reject)=>reject(1))文章来源地址https://www.toymoban.com/news/detail-826798.html

    new Promise((resolve,reject)=>reject('error')).catch((err) => console.log(err))   // error
    Promise.reject('error').catch((err) => console.log(err))  // error
    

到了这里,关于前端Promise理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 零基础学前端(二)用简单案例去理解 HTML 、CSS 、JavaScript 概念

    该篇适用于从零基础学习前端的小白 初学者不懂代码得含义也要坚持模仿逐行敲代码,以身体感悟带动头脑去理解新知识 HTML,CSS,JavaScript 都是单独的语言;他们构成前端技术基础; (1)HTML:负责网页的架构; (2)CSS:负责网页的样式,美化; (3)JavaScript(JS):负责

    2024年02月08日
    浏览(39)
  • 深入理解JavaScript模块化开发

    前言: 随着JavaScript应用程序的复杂性不断增加,模块化开发成为了一种必备的技术。通过将代码划分为模块,我们可以提高代码的可维护性、可重用性和可扩展性。在本文中,我们将深入探讨JavaScript模块化开发的概念、优势和不同的模块化方案。 模块化开发是将一个大型应

    2024年02月08日
    浏览(73)
  • 前端经典面试题 | 吊打面试官系列 之 说说你对TypeScript 和 JavaScript的理解

    🖥️ 前端经典面试题 专栏:吊打面试官系列 之 说说你对TypeScript 和 JavaScript的理解 🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 ✨ 个人主页:CoderHing的个人主页 🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ 👉 你的一键三连是我更新的最大动力❤️ 目录 一、回答

    2024年01月17日
    浏览(37)
  • 快速认识,前端必学编程语言:JavaScript

    JavaScript是构建Web应用必学的一门编程语言,也是最受开发者欢迎的热门语言之一。所以,如果您还不知道JavaScript的用处、特点的话,赶紧补充一下这块基础知识。 JavaScript 是一种高级、单线程、垃圾收集、解释或即时编译、基于原型、多范式、动态语言,具有非阻塞事件循

    2024年02月05日
    浏览(37)
  • 前端开发——Javascript知识(介绍)

    目录 有关JavaScript的知识  JavaScript的优点   JavaScript的领域 JavaScript的组成 JavaScript的特点 第一个JavaScript程序 在 HTML 文档中嵌入 JavaScript 代码 在脚本文件中编写 JavaScript 代码 JavaScript内容  Html内容  JavaScript 代码执行顺序 JavaScript中的几个重要概念 标识符 保留字 区分

    2024年02月01日
    浏览(37)
  • 前端开发——JavaScript的条件语句

      世界不仅有黑,又或者白 世界而是一道精致的灰  ——Lungcen     目录 条件判断语句 if 语句 if else 语句 if else if else 语句  switch语句 break case 子句 default语句 while循环语句 do while循环语句 for循环语句 for 循环中的三个表达式 for 循环嵌套 for 循环变体——for in for 循环

    2023年04月21日
    浏览(33)
  • JavaScript 之 promise

    封装和调用不是同一个人,不清楚如何调用 设计者不好设计,调用者调用很麻烦 从一个实际的例子来作为切入点: 调用一个函数,这个函数中发送网络请求(可以用定时器来模拟) 如果发送网络请求成功了,那么告知调用者发送成功,并且将相关数据返回过去 如果发送网

    2024年01月21日
    浏览(31)
  • JavaScript Promise

    JavaScript Promise 是一种用于处理异步操作的对象。它表示一个异步操作的最终完成或失败,并且可以处理操作的结果或错误。 Promise 对象有三种状态: 1. Pending(进行中):初始状态,表示操作正在进行中,既不是成功也不是失败。 2. Fulfilled(已完成):表示操作成功完成,并

    2024年02月06日
    浏览(28)
  • 【JavaScript】手写Promise

    🐱 个人主页: 不叫猫先生 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏:vue3从入门到精通、TypeScript从入门到实践 📢 资料领取:前端进阶资料可以找我免

    2024年02月05日
    浏览(27)
  • 【前端灵魂脚本语言JavaScript⑤】——JS中数组的使用

    🐚 作者: 阿伟 💂 个人主页: Flyme awei 🐋 希望大家多多支持😘一起进步呀! 💬 文章对你有帮助👉关注✨点赞👍收藏📂 第一种: var 数组名 = new Array(); 创建一个空数组 第二种: var arr2 = new Array(10); 创建一个定长为10的数组 第三种 var arr3 = new Array(a,b,c); 创建时直接指定元素值

    2023年04月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包