Promise中的链式流

在这里插入图片描述

如果阅读有疑问的话,欢迎评论或私信!!
本人会很热心的阐述自己的想法!谢谢!!!
携手共进!

文章目录

  • 前言
  • 深入Promise链式流

前言

在探索Promise链式流之前我们要知道两个Promise固有行为特性:

  • 在Promise的每个then()方法之后,都会返回一个全新的Promise;(1)
  • 不管在这个全新的Promise中返回值是什么,他都会被自动设置为被链接的Promise完成;(2)

深入Promise链式流

或许知道这两个特性后有些不太理解,那我们通过下面这个例子来一起认识吧!

var p1  = Promise.resolve(1); //这里p1是一个Promise并且决议值为1
var p2 = p1.then(function(msg){
		return msg * 100;//在返回这个值时,同时返回了一个Promise,证明(1)时正确的!!
});

p2.then(function(msg){//此时p2的决议值为100,被自动设置为了完成状态,也就是(2)所说。
	console.log(msg) //100
})

现在我们应该掌握了以上两个行为特性的原理!!!!!

但是,在上面代码中,我们需要使用p2来充当中间变量,这样看起来有点奇奇怪怪的……那现在我们可以引入我们的主题:Promise 的链式流。

我们可以把上面的代码改造一下:

Promise.resolve(1)
.then(function(msg){

		return msg * 100;//在返回这个值时,同时返回了一个Promise,证明(1)时正确的!!
		
}).then(function(v){//此时p2的决议值为100,被自动设置为了完成状态,也就是(2)所说。

	console.log(v) //100
	
})

这一下我们就看起来舒服了许多(强迫症的福音…)

现在我们就可以通过then进行扩展,第一步then、第二步then…可以一直扩展下去!

引入异步

但是在上面的代码中,我们使用了return来结束第一步,即立即完成第一步进行第二步,那么如果我们需要在第一步时进行异步编程的话,那么第二步是直接进行还是等待第一步异步编程结束后再进行呢?

我们当然希望Promise的第二步是在等待第一步异步完成之后再继续执行,因为我们使用Promise的最大好处就是可以使得异步编程变得可控!如果第二步直接进行,那么我们的代码顺序又要变得混乱起来!我们通过以下代码更深刻记忆:

var p = Promise.resolve(1);

p.then(function(v){

	return new Promise(function(resolve,reject){
	
		resolve( v * 100 );
		
	})
	
}).then(function(v){

	console.log(v)	//100
	
})

在该代码中,Promise在推进的同时,会展开then中的Promise,并作为最终的决议值!

这也是Promise的一个行为特性!!

下面引入setTimeout来查看是否如我们所说!

var p = Promise.resolve(1);

p.then(function(v){

	return new Promise(function(resolve,reject){
		setTimeout(fuction(){
			resolve( v * 100 );
		},1000)
	})
	
}).then(function(v){
	//等待1000ms后开始运行
	console.log(v)	//100
	
})

如我们所见,Promise链式流是一步一步进行的,如果遇到异步操作,会根据需要等待之后完成!

在Promise中还有更解决了回调中的一些问题,详情请移步至本人所写的另外一篇文章,这里附上链接Pormise—如何解决javascript中回调的信任问题?【详解】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/402019.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++类和对象新手保姆级上手教学(下)

目录 前言: 初始化列表: explicit关键字: static成员: 友元函数: 友元类: 内部类: 匿名对象: 前言: 类和对象下篇中剩余的部分较为简单易理解,认真记住…

程序员接私活还不知道这几个平台?那你亏到老家了!

程序员接私活现在已经是一个老生常谈的话题了,现在市面上各种程序员接单平台层出不穷,也参差不齐,有比较老牌的知名平台,也有比较好的新兴平台,如此多的平台就容易让人眼花缭乱,不知道该如何选择。 这期文…

day04_流程语句_if_while_for

今日内容 1.if 2.switch 3.while,do-while,for 零、复习 1算术运算符中除法特性 整数相除不保留小数 10/33 2什么作用,i和i什么区别 让数据自增1i,是在后先使用后自增i,是在前先自增后使用 3&& 和 & 有相同点和不同点 相同点: 两边判断式子,一错就错全对才对不同点…

Docker Desktop 4.27.1 Windows 10 安装 教程

Docker Desktop 4.27.1 Windows 10 安装 版本要求windows 版本要求wsl 版本要求docker desktop 版本 安装首先确保系统版本符合要求前提下安装wsl安装 Dockers Desktop安装说明 安装问题docker Desktop 无法正常启动,提示wsl 相关信息wsl --install 执行输出帮助日志…

[Flink01] 了解Flink

Flink入门系列文章主要是为了给想学习Flink的你建立一个大体上的框架,助力快速上手Flink。学习Flink最有效的方式是先入门了解框架和概念,然后边写代码边实践,然后再把官网看一遍。 Flink入门分为四篇,第一篇是《了解Flink》&…

如何在OpenWRT安装内网穿透工具实现远程访问本地搭建的web网站界面

文章目录 前言1. 检查uhttpd安装2. 部署web站点3. 安装cpolar内网穿透4. 配置远程访问地址5. 配置固定远程地址 前言 uhttpd 是 OpenWrt/LuCI 开发者从零开始编写的 Web 服务器,目的是成为优秀稳定的、适合嵌入式设备的轻量级任务的 HTTP 服务器,并且和…

2024 全国水科技大会暨第二届智慧水环境管理与技术创新论坛

论坛二:第二届智慧水环境管理与技术创新论坛 召集人:刘炳义 武汉大学智慧水业研究所所长、教授 为贯彻落实中共中央国务院印发《数字中国建设整体布局规划》和国务院关于印发《“十四五”数字经济发展规划》的通知,推动生态环境智慧治理&…

stm32和嵌入式linux可以同步学习吗?

在开始前我有一些资料,是我根据网友给的问题精心整理了一份「stm3的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!如果需要使用STM32,建…

源码剖析Spring依赖注入:今天你还不会,你就输了

在之前的讲解中,我乐意将源码拿出来并粘贴在文章中,让大家看一下。然而,我最近意识到这样做不仅会占用很多篇幅,而且实际作用很小,因为大部分人不会花太多时间去阅读源码。 因此,从今天开始,我将…

【Vue3】toRefs和toRef在reactive中的一些应用

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

sql server想要小数点后向下取整怎么搞

select FORMAT(3.169, N2) as 四舍五入1, CAST(3.169 AS decimal(9,2)) as 四舍五入2, ROUND(3.169, 2) as 四舍五入3, CAST(FLOOR(3.169 * 100) / 100 AS decimal(9,2)) as 向下取整1, FLOOR(3.169 * 100) / 100 as 向下取整2, ceiling(3.169 * 100) / 100 as 向上取整—…

如何使用 GitHub Action 在 Android 中构建 CI-CD

如何使用 GitHub Action 在 Android 中构建 CI-CD 一、什么是 CI/CD?二、什么是 CI:持续集成?三、什么是CD:持续部署?3.1 持续交付3.2 持续部署 四、使用 GitHub 操作在 Android 中构建 CI-CD 管道4.1 步骤 五、什么是…

K210基础实验——点亮LED灯

一、目的是点亮K210开发板左下角的LED0和LED1,LED0是红灯,LED1是绿灯,两颗LED灯都是低电平点亮,高电平熄灭。 二、这是原理图上的硬件连接,LED0连接的是IO0,LED1连接的是IO17。 三、在src目录下新建文件夹 …

P2670 [NOIP2015 普及组] 扫雷游戏 ---- 洛谷

题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n 行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子…

《游戏引擎架构》--学习3

内存管理 优化动态内存分配 维持最低限度的堆分配,并且永不在紧凑循环中使用堆分配 容器 迭代器 Unicode

uni-app搭建h5项目

一、 打开官方网站 https://uniapp.dcloud.net.cn/quickstart-cli.html 二、找到使用vue-cli命令行,按照文档上的步骤进行搭建 全局安装 vue-cli npm install -g vue/cli搭建项目 可以根据命令行搭建,搭建vue2.0对应的是webpack, 也可以搭…

vulnhub靶场---->DOUBLETROUBLE: 1

详细思路 知识点1.网段探测2.nmap扫描3.目录扫描4.隐写5.上传木马文件6.awk提权 知识点 图片隐写----->steghide 密码爆破----->stegseek awk提权------>sudo awk BEGIN {system("/bin/bash")}1.网段探测 kali:192.168.0.131 靶机:192.168.0.1…

微信小程序-消息订阅整体流程

1.首先登录微信公众平台,网址:微信公众平台 2.找到“订阅消息”,如果订阅消息没开启,可以点击开启,然后根据自己的消息需求到公共模版里找合适的,然后点击选用,如果没有比较合适的可以申请模版…

【开源】SpringBoot框架开发音乐平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首音乐4.2 新增音乐4.3 新增音乐订单4.4 查询音乐订单4.5 新增音乐收藏 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的音乐平台,包含了音乐…

使用maven集成spring在测试的时候报出了如下的异常:version 60

使用maven集成spring在测试的时候报出了如下的异常: Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 60 解决: