Promise的详解----未完待续

Promise详解-1:初识Promise 不懂Promise?看这篇教程就够了 阅读详情

Promise的详解

一、Promise的理解与使用

1.1 Promise是什么?

抽象理解:
① Promise是一门新的技术
② Promise是JS中异步编程的新解决方案 【备注:旧的方案则是完全通过回调函数来解决】

//1、旧的方案
function ajax(callback) {
	const xhr = new XMLHttpRquest();
	xhr.open("get","./index.html");
	xhr.send();
	xhr.onload = function(callback) {
		//通过回调函数,返回响应数据到外部
		callback(xhr.response);
	}
}
ajax(function(data){
	//弹出响应数据
	alert(data);
});
ajax(function(data){
	//输出响应数据
	console.log(data);
});

//2、Promise方案
function ajax(){
	//函数返回Promise
	return new Promise(function(resolve){
		const xhr = new XMLHttpRequest();
		xhr.open("get","./index.html");
		xhr.send();
		xhr.onload = function(){
			//状态为成功,值为xhr.response
			resolve(xhr.response);
		}
	})
}
//根据Promise获取状态,根据成功状态,将成功值输出
ajax().then(value=>{
	//通过value返回获取的响应数据,输出数据
	console.log(value);
})
ajax().then(value=>{
	//通过value返回获取的响应数据,弹出数据
	alert(value);
})

具体的表达:
① 从语法上来说:Promise是一个构造函数

//通过Promise构造函数,创建实例化对象p
const p = new Promise(()=>{});

② 从功能上来说:Promise对象用来封装异步操作,并可以获取其成功/失败的值

function ajax(url){
	return new Promise(function(resolve,reject){
		const xhr = new XMLHttpRequest();
		xhr.open("get",url);
		xhr.send();
		xhr.onload(){
			resolve(xhr.response);
		}
		xhr.onload(){
			reject(xhr.response);
		}
	})
}
//这里参数填写的是路径,我是直接写入了当前页面,响应的数据是当前html页面的代码
ajax("index.html").then(value=>{
	console.log(value);
},readson=>{
	console.log(readson);
})

以上代码,整体思路就是,通过调用ajax函数,返回Promise回调函数的状态,通过状态去执行对应状态下的语句,最后输出响应数据。

1.2 Promise的状态

Promise的状态有三种:pending(初始状态)、fulfilled(成功状态)、rejected(失败状态)。
说明:
① 只能通过pending状态>>>fulfilled或rejected状态,且一个Promise对象只能变更一次
② 无论变更为成功还是失败,都将会有个结果数据
③ 成功的结果数据一般为value,失败的结果数据一般为reason
④ Promise是一个构造函数,必须要接收一个参数——同步的回调函数(称为执行构造器executor)

//实例化Promise,并将实例化的结果赋值给常量p,常量p可以称为Promise的实例
const p = new Promise(function(){

})
console.log(p);//状态为pending(初始化),值为undefined
//pending>>>fulfilled:通过调用resolve方法
const p = new Promise((resolve,reject)=>{
	resolve(1);
})
console.log(p);//状态:fulfilled,值:1
//pending>>>rejected:
//第一种:通过调用reject方法
const p = new Promise((resolve,resject)=>{
	reject(100);
})
console.log(p);//状态:rejected,值:100

//第二种:通过抛出异常
const p = new Promise(()=>{
	//制造一个异常
	const m = "xixi";
	m();
})
console.log(p);//状态:rejected,值:TypeError: m is not a function

const p = new Promise(()=>{
	//抛出异常
	throw "异常";
})
console.log(p);//状态:rejected,值:异常
//一个Promise对象,状态只可修改一次
const p = new Promise((resolve,reject)=>{
	resolve(100);
	reject(200);
})
console.log(p);//状态为:成功,值:100
1.3 Promise的基本使用

Promise中的执行器函数,为同步回调函数

//同步回调,先输出aaaa,然后输出bbbb
const p = new Promise((resolve,reject)=>{
	console.log("aaaa");
})
console.log("bbbb");
1.3.1 基本流程:

在这里插入图片描述

then方法接收两个参数,参数类型均是函数(异步回调函数)
第一个参数称为成功回调函数,当数据状态变更为成功时,调用此函数,接收的值即是成功的值
第二个参数称为失败回调函数,当数据状态变更为失败时,调用此函数,接收的值即是失败的值
注意:then方法为Promise原型上的方法。

const p = new Promise((resolve,reject)=>{
    // resolve(100);
    reject(10);
	})
	p.then(function(value){
	    console.log("成功回调",value);
	},function(reason){
	    console.log("失败回调",reason);
	})
}
1.3.2 基于定时器的异步

执行器函数中,往往需要处理异步编程,状态可以异步更改

const p = new Promise((resolve,reject)=>{
	//通过定时器回调函数,进行异步操作
	setTimeout(()=>{
		reject(100);
	},1000)
})
p.then(value=>{
	console.log("成功回调",value);
})
p.then(readson=>{
	console.log("失败回调",readson);
})
1.3.3 Promise的优点

① 指定回调函数的方式更加灵活 (旧版:必须在启动异步任务前指定回调函数)
② 支持链式调用,可以解决回调地狱问题
回调地狱:回调函数嵌套调用, 外部回调函数异步执行的结果是嵌套的回调执行的条件
回调地狱的弊端:①不便于阅读;②不便于异常处理
回调地狱的解决方案:① Promise的链式调用;②async/await

二、回调函数

特点:①自己定义的;②不是自己调用;③会在特定的情况下调用

2.1 同步回调

说明:立即执行,直到全部执行完才结束,不会放到回调队列中
在Promise中excutor函数为同步回调函数

const arr = [1,2,3,4];
//map的参数为一个回调函数
arr.map(num=>{
	console.log(num);
	return num+1
});
console.log("over");
const p = new Promise((resolve,reject)=>{
	//只会执行首个,后面的不执行
	resolve(1);//表示成功状态,值为1
	reject(2);//表示失败状态,值为2
})
console.log(p);//成功,值为1
2.2 异步回调

说明:不会立即执行,会放到回调队列中去排队执行
定时器回调、ajax回调 、Promise的成功|失败的回调等,都属于异步回调

//定时器的回调
setTimeout(()=>{
	console.log("timeout");
})
console.log("over");
//ajax请求中的回调函数
const xhr = new XMLHttpRequest();
xhr.open("get","./index.html");
xhr.send();
//onload事件函数,在请求发送并得到响应后执行
xhr.onload = function(){
    console.log(xhr.response);
}
console.log("over");
//Promise中的回调函数
new Promise((resolve,reject)=>{
	//返回成功状态,值为1
	resolve(1);
	//根据实例化对象最终得到的状态,判断要执行成功或失败函数
}).then(value=>{
	console.log(value);//返回值
},readson=>{
	console.log(readson);//返回值
})

三、Promise中的API

1. 函数
//(1)executor函数:执行器>>>(resolve,reject)=>{}
new Promise((resolve.reject)=>{
	console.log("执行器,同步执行");
})

//(2)resolve函数:内部定义成功时,调用的函数 value=>{}
const p = new Promise((resolve,reject)=>{
	resolve(100);
})
p.then(value=>{
	// 成功回调函数:resolved函数
	console.log(value);
})

//(3)reject函数:内部失败时,调用的函数  readson=>{}
const p = new Promise((resolve,reject)=>{
	reject(200);
}).then(value=>{

},readson=>{
	// 失败回调函数,rejected函数
	console.log(readson);
})

说明:executor会在Promise内部立即同步调用,异步操作在执行器中执行

//1.同步调用
const p = new Promise((resolve,reject)=>{
	console.log(1);
})
console.log(2);
//执行结果为 1  2

//2.执行器函数中往往处理异步行为
new Promise((resolve,reject)=>{
 setTimeout(()=>{
     resolve(100)
 })
})
2. 方法

1、Promise.prototype.then方法:有两个参数(onResolved, onRejected)
(1) onResolved函数: 成功的回调函数 (value) => {}
(2) onRejected函数: 失败的回调函数 (reason) => {}
说明: 指定用于得到【成功value】的成功回调和用于得到【失败reason】的失败回调,返回一个新的promise对象

// 1- 最基本的
const p = new Promise((resolve,reject)=>{
	resolve(100);
})
	p.then(function(value){
 	//onResolved函数:当状态更改为成功后调用,value为成功值
},function(reason){
 	//onRejected函数:当状态更改为失败后调用,reason为失败值
})

// 2- then函数返回的是一个新的Promise对象
// then接收的成功回调或失败回调为异步调用。
// p.then的返回结果是一个新的Promise,Promise的状态以及值受成功或失败的返回值的影响!!!!
// 当成功或失败回调函数返回的是一个非Promise——状态为成功的Promise实例,值为返回值。
// 当成功或失败回调函数返回的是一个Promise——Promise实例状态以及值,同成功或失败回调返回的Promise相同。
// 当成功或失败回调函数有异常,那么得到的是Promise状态为失败,值为异常信息
{
	// 2-1 p的状态为fulfilled,值为100,p2的状态以及值要看成功回调函数的返回值
	const p = new Promise((resolve,reject)=>{
	 	resolve(100);
	})
	// p2的值为p.then的返回结果
	const p2 = p.then(value=>{
	 	console.log("成功回调",value);
	})
	console.log(p2);// 成功Promise实例,值为undefined
}
{
	// 2-2 得到的p2是一个新的promise
	const p = new Promise((resolve,reject)=>{
	 	resolve(100);
	})
	const p1 = new Promise((resolve,reject)=>reject(2000));
	// p2的值为p.then的返回结果
	const p2 = p.then(value=>{
	// 返回一个失败的Promise
		return p1
	})
	console.log(p2,p2===p1);// 失败Promise实例,值为2000  false
}
{
     // 2-3 得到的p2是一个新的promise
     const p = new Promise((resolve,reject)=>{
      	reject(100);
     })
     // p2的值为p.then的返回结果
     const p2 = p.then(value=>{
     // 返回一个失败的Promise
      	return 1
     },reason=>{
      	return new Promise((resolve,reject)=>reject(1000))
     })
     console.log(p2);// 失败Promise实例,值为1000
 }
JS高级-Promise系列详解 Promise是ES6之后新增的一个重要知识点(也可以说是最重要的知识点之一),是每个前端开发都必须要掌握的知识点,因为这与我们正式编写项目时,需要与后端交互的网络请求息息相关但是对于Promise的学习来说,很多同学会觉得有点迷茫,刚开始不知所云、困难重重在本章节中,我们会认识Promise究竟是一个怎么样的API,在Promise出现之前,我们都是怎么进行书写的,以及当Promise出现后,都有哪些方法以及如何使用Promise的类方法与对象方法有什么区别,为什么要区分开为两种方法? 阅读详情

相关推荐

KTransformers安装笔记 利用docker安装KTransformers

KTransformers安装笔记 利用docker安装KTransformers

guoqingru0311的博客 1560

ES6之promise函数

为什么使用promise 解决回调函数地狱问题(逻辑不清晰)更好理解 promise具有单一状态值,解决信任问题,具有良好的准则规范 如何使用 promise为构造函数 通过 变量赋值 = new promise(resolve,reject); promise函数可以传两个参数 一个成功状态执行,一个失败状态执行 状态 ①pedding //初始状态 ②resolve //成功状态 ③rejec...

Air_Son的博客 797

单总线CPU设计(变长指令周期3级时序)(HUST)(头歌实验)

利用比较器等功能模块将32位MIPS 指令字译码生成LW、SW、BEQ、SLT、ADDI、OtherInstr信号也就是利用比较器将指令字转换为译码信号,OP与不同信号对应(查询MIPS手册得知) 16 进制 :23 是 2进制: 00100011 ,把获得的OP,Func,和常数比对,相同输出1.按照题目要求填写表格,使用logisim的组合逻辑电路分析功能,当然也可以直接再logisim中写真值表。单总线采用变长指令周期,不同指令周期数不同,节拍数可变化。写的excel表格最终生成电路(当然 需要先把

xuxuaifeifei的博客 1万+

Promise详解与使用

一、promise是什么? 二、promise的优点 1.指定回调函数的方式更灵活 2.链式调用,解决回调地狱问题 三、promise执行特点 四、promise的状态属性 五、promise的API 1.then方法 2.catch方 3.finally方法 4.all方法 5.race方法 总结 1.promise 实例对象创建有几种方式 2.[[PromiseResult]] 赋值有几种方式 3.[[PromiseResult]] 取值有哪些方式

weixin_71258678的博客 1780

如何下载安装Qt各个版本?(2025-4-28更新)

本文将教您快速获取Qt各版本安装包!妈妈再也不用担心我找不到Qt安装包了!

程序区 5117

Ubuntu 22.04 实战:为WIFI6网卡Realtek RTL8852BE手动编译驱动指南

本文详细介绍了在Ubuntu 22.04系统上为Realtek RTL8852BE WIFI6网卡手动编译驱动的完整指南。从问题诊断、环境准备到源码获取、编译安装,逐步解决驱动缺失问题,并提供常见问题排查和性能优化建议,帮助用户充分发挥WIFI6网卡性能。

weixin_30808693的博客 478

Promise 的用法

Promise是什么 JS就是操作对象上的属性和方法,对于一个对象,想要了解,我们可以直接从其身上的属性和方法入手;直接使用console.dir(对象)打印出来 从上面打印出来的属性和方法,可以看到Promise是一个构造函数,有属于自己私有的all,reject,resolve,rece等方法,也有原型上面的,属于实例对象调用的方法then,catch // Promise里面传入一个函数类...

JSN___的博客 358

HUAWEI华为荣耀MagicBook MateBook B D E X 13 14 16 笔记本MateStation台式机原装Win10出厂Windows11系统

HUAWEI华为MateBookX原装出厂系统恢复原厂系统,型号:MACHC-WAE9LP、EUL-W29P、MACHR-W19L、MACHR-W29、MACHD-WFE9、MRGF-16、MACHR-W19BL、MACHD-WFE9Q、WT-W19、Mach-W19、Mach-W29、WT-W09、WT-W19、MACH-W29等。HUAWEI华为MateBookE原装出厂系统恢复原厂系统,型号:PAK-AL09、GK-W7X、GK-G58、GK-W76、DRC-W76等。

QQ17855069的博客 17万+

Promise详细解说

Promise详细解说

ww2727的博客 864

【Clickhouse从入门到精通】第51篇:ClickHouse权限管理体系详解

摘要 本文是ClickHouse权限管理系列文章的第51篇,重点解析ClickHouse RBAC权限体系中的GRANT/REVOKE机制。文章详细介绍了GRANT语句的基础语法与权限类型,包括SELECT、INSERT等常规权限以及WITH GRANT OPTION转授权功能。特别深入讲解了列级权限的实现方式,通过SELECT(col1,col2)语法实现字段粒度的访问控制,并展示了权限查询与验证方法。本文还对比了ClickHouse 20.4版本前后权限管理体系的差异,为构建安全的多租户数据平台提供了关

xyghehehehe的专栏 440

网安保研避坑指南:中科院信工所各研究室真实体验与导师选择建议

本文为中科院信工所网络安全保研生提供深度指南,详细解析了信工所六个研究室的研究方向、真实氛围与导师选择策略。文章特别强调,选择导师是决定研究生体验的关键,并提供了针对各研究室的避坑建议与实战调研方法,帮助学生做出明智选择。

weixin_29210727的博客 1582

js promise 异步取值和赋值问题

bug背景 var name = ''; let res = this.$apiW.findTask( { 'numbers' : numbers} ).then((res) => { console.log(res , pagesJson ); // uni.showToast({ // title: res.data ...

吴灵辉的博客 9897

iqoo11如何获取root权限?

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 5819

Promise详解

前言: 日常开发中,异步操作几乎每天都能见到。传统的意不解决方案是通过回调函数,随着程序逻辑越来越复杂,回调函数的方式变得越来越繁琐,很容易出现回调地狱,于是一种更合理更强大的代替方案出现–Promise,接下来就深入学习Promise是如何解决异步操作的。 一.基础 定义: Promise 对象用于表示一个异步操作的最终完成 (或失败), 及其结果值. const promise1 = new Promise((resolve, reject) => { setTimeout(() =&gt

weixin_49759035的博客 9994

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【JavaScript】Promise 的三种状态详解

Promise是 JavaScript 中用于处理异步操作的对象。通过使用 Promise,开发者可以避免深层嵌套的回调函数(俗称“回调地狱”),从而提高代码的可读性和可维护性。一个PromisePending(进行中):初始状态,表示异步操作尚未完成,处于等待状态。Fulfilled(已完成):表示异步操作成功完成,并返回结果。Rejected(已拒绝):表示异步操作失败,并返回错误原因。Promise 提供了一种简洁有效的方式来处理 JavaScript 中的异步操作,它的三种状态(

lph159的博客 2858

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Promise详解大全

Promise它的是执行的,then 方法是执行的,所以Promise创建后里面的函数会立即执行,构造函数中的resolve和reject只有第一次执行有效,,也就是说。

zhoupenglkh的博客 1328

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Promise详解-2:Promise的进阶使用

不懂Promise的进阶?这篇文章直接教会你

sharkchen的专栏 1428

JavaScript Promise返回值详解

JavaScript Promise返回值详解Promise回顾 Promise回顾 Promise对象是JavaScript ES6标准中一个重要的内容,它是为了异步而生的,相比于经典的回调函数写法,在处理大量异步任务时使用Promise链在可读性上会远远优于回调函数导致的回调地狱,本文建立在读者已经对Promise有所了解的情况下,如果你还不了解Promise,可以参考MDN上的这篇文章。 ...

比利Billy 4万+

promise详解

一、promise含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。 二、异步和回调 异步处理的模型:ES

A20201130的博客 1万+

Promise 详解

在实际开发中Promise函数是必不可少的一环,我们经常用来对异步函数进行同步编程范式的处理,比如请求超时、异步获取chrome.storage存储等,JS基础面试时也经常会问到,不熟悉Promise的话基本上gg了((✿◠‿◠))Promise实际上是一个对象,是用来表示一个异步任务结束之后是成功还是失败,状态一经改变不可逆转try {//执行回调函数//状态//成功返回的值//失败原因//成功回调//失败回调//执行成功结果//状态不是等待中则停止执行//修改状态//保存返回值。

qq_32453495的博客 1471

ES6的Promise详解

本篇文章主要介绍了ES6语法中的Promise对象的使用详解,promise对象是JS进阶学习中的重要知识点,如果本文对你有所帮助请三连支持博主,你的支持是我更新的动力,先赞后看养成习惯。以下是本篇文章正文内容。

程序员柒的博客 6084

详解Promise用法

Promise 是 JavaScript 中用于处理异步操作的一种重要机制。Promise 用于解决 JavaScript 中异步操作的复杂性,通过状态管理、链式调用、错误处理等功能,实现代码的清晰、有序与可维护,避免回调地狱,提升异步编程的效率与体验。

qq_52869537的博客 1270

详解Promise——Promise的方法有哪些

是 JavaScript 中用于处理异步操作的对象,它提供了一系列方法来处理异步流程。

qq_74162234的博客 2568
上一篇: xhr使用的简单总结
下一篇: Axios总结(个人留存)
engineer_why
博客等级 码龄6年 233粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

engineer_why

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值