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中回调的信任问题?【详解】

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速将excel/word表格转换为web页面(html)的方法

前言 在进行开发企业信息化建设的过程,应该有很多这样的场景,就是将现有的电子表格记录的方式转换为在数据系统中进行网页上报。也就是需要根据当前一直使用的表格制作一个上传这个表格信息的网页,如果要减少系统的使用学习成本,…

Vue3之ref与reactive的基本使用

ref可以创建基本类型、对象类型的响应式数据 reactive只可以创建对象类型的响应式数据 接下来让我为大家介绍一下吧! 在Vue3中,我们想让数据变成响应式数据,我们需要借助到ref与reactive 先为大家介绍一下ref如何使用还有什么注意点 我们需…

考研高数(高阶导数的计算)

1.归纳法 常见高阶导数 2.泰勒展开式 3.莱布尼兹公式 4.用导数定义证明导函数在某一点连续的例题

MLflow【部署 01】MLflow官网Quick Start实操(一篇学会部署使用MLflow)

一篇学会部署使用MLflow 1.版本及环境2.官方步骤Step-1 Get MLflowStep-2 Start a Tracking ServerStep 3 - Train a model and prepare metadata for loggingStep 4 - Log the model and its metadata to MLflowStep 5 - Load the model as a Python Function (pyfunc) and us…

alibabacloud学习笔记06(小滴课堂)

讲Sentinel流量控制详细操作 基于并发线程进行限流配置实操 在浏览器打开快速刷新会报错 基于并发线程进行限流配置实操 讲解 微服务高可用利器Sentinel熔断降级规则 讲解服务调用常见的熔断状态和恢复 讲解服务调用熔断例子 我们写一个带异常的接口:

【海贼王的数据航海:利用数据结构成为数据海洋的霸主】时间复杂度 | 空间复杂度

目录 1 -> 算法效率 1.1 -> 如何衡量一个算法的好坏? 1.2 -> 算法的复杂度 2 -> 时间复杂度 2.1 -> 时间复杂度的概念 2.2 -> 大O的渐进表示法 2.3 -> 常见时间复杂度计算 3 -> 空间复杂度 4 -> 常见复杂度对比 1 -> 算法效…

IO进程线程

IO练习 互斥机制练习 #include <myhead.h> int num 520; pthread_mutex_t mutex;void *task1(void *arg) {printf("11111111\n");pthread_mutex_lock(&mutex);num 1314;sleep(3);printf("task1:num%d\n",num);pthread_mutex_unlock(&mut…

Vue样式绑定

1. 绑定 HTML class ①通过class名称的bool值判断样式是否被启用 <template><!--通过样式名称是否显示控制样式--><div :class"{ haveBorder: p.isBorder, haveBackground-color: p.isBackgroundcolor }">此处是样式展示区域</div><br /…

基于springboot+vue的中小企业设备管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

mac真的安装不了vmware吗 mac如何安装crossover crossover序列号从哪里买 购买正版渠道

有些用户可能想在mac上运行一些只能在windows上运行的软件&#xff0c;比如游戏、专业软件等。这时候&#xff0c;就需要用到虚拟机技术&#xff0c;也就是在mac上安装一个可以模拟其他操作系统的软件&#xff0c;比如vmware或者crossover。那么&#xff0c;mac真的安装不了vmw…

众安保险基于Apache SeaTunnel的生产应用实践

*> 文&#xff5c;曾力 众安保险大数据开发高级专家 编辑整理&#xff5c; 曾辉* 前言 众安保险从2023年4月就开始了数据集成服务的预研工作&#xff0c;意在通过该服务解决当前数据同步场景下的两大痛点&#xff0c;服务化能力薄弱和无分布式同步能力。我们对多种开源数据…

独家深度 | 一文看懂 ClickHouse vs Elasticsearch:谁更胜一筹?

简介&#xff1a; 本文的主旨在于通过彻底剖析ClickHouse和Elasticsearch的内核架构&#xff0c;从原理上讲明白两者的优劣之处&#xff0c;同时会附上一份覆盖多场景的测试报告给读者作为参考。 作者&#xff1a;阿里云数据库OLAP产品部 仁劼 原文地址:https://developer.ali…