大白话讲Promise(最详细)

        学前端的大家都知道promise是重中之重,也是面试的必考项。但是刚接触promise我一直很晕头晕脑的,搜集文章前看后看基本都是讲解promise的状态它的方法就没有再深入了,以至于面试时候面试官一旦往深问我就懵了。所以今天我们就详细的说一下promise吧!!

        promise是什么呢?它有什么用呢?为什么需要promise呢?

promise是什么?

        promise就是一个异步编程的解决方案,ok我猜你应该没明白。gpt告诉我他是一个用来管理任务状态和结果的容器。

它有三种状态:pending,fulfilled,rejected,而且状态的变化只可以从pending-->fufilled;pending-->fufilled

promise有什么用?

        这个问题就要追朔到回调函数以及js的异步机制上了。

        js是单线程语言,同一时间内只能执行一个任务。如果其中一个任务执行时间很长,那么后续的任务就要等待很久才能执行。举个例子,比如你在某平台点一份外卖(1分钟),商家制作(10分钟),外卖员送餐(加入距离远需要30分钟),现在规定外卖员在商家制餐这段时间什么都不能做只能在店里等着,你在送餐这段时间什么都不能做只能等餐,你想想是不是很痛苦。现在有一种机制叫异步,异步的话就是商家制餐这段时间外卖员可以去送别的单子,等做好了通知外卖员取餐。外卖员送餐这段时间你不用干等它,你去美美的刷了半小时短视频,然后外卖到了给你打电话。画个图理解(有错误望指出,避免错误引导)

        那么怎么实现异步呢?这就需要用到回调函数了!回调函数是传递给另一个函数并且在某个时机执行的函数

不使用回调函数,同步调用

// 点外卖函数
function orderWaiMai() {
    console.log('点外卖');
}

// 做外卖函数
function cookWaiMai() {
    console.log('做外卖');
    console.log('外卖做好了');
}

// 送外卖函数
function sendWaiMai() {
    console.log('外卖员送外卖');
    console.log('外卖送到了');
}

// 吃饭函数
function eat() {
    console.log('可以吃饭了');
}

// 刷短视频函数
function watchVideo() {
    console.log('刷短视频');
}

// 主函数
function main() {
    orderWaiMai();  // 点外卖
    cookWaiMai();   // 做外卖
    sendWaiMai();   // 外卖送到
    watchVideo();   // 刷短视频
    eat();          // 可以吃饭了
}

main();

使用回调函数,异步调用

// 点外卖函数
function orderWaiMai(callback) {
    console.log('点外卖');
    callback();  // 点外卖完,通知开始做外卖
}

// 做外卖函数
function cookWaiMai(callback) {
    console.log('做外卖');
    setTimeout(() => {  // 模拟做外卖的耗时,假设做外卖需要 3 秒
        console.log('外卖做好了');
        callback();  // 外卖做好了,通知外卖员来取
    }, 3000);  // 3秒后执行回调,模拟做外卖的过程
}

// 送外卖函数
function sendWaiMai(callback) {
    console.log('外卖员送外卖');
    setTimeout(() => {  // 模拟送外卖的耗时,假设送外卖需要 2 秒
        console.log('外卖送到了');
        callback();  // 外卖送到,通知可以吃饭了
    }, 2000);  // 2秒后执行回调,模拟送外卖的过程
}

// 刷短视频函数
function watchVideo() {
    console.log('刷短视频');
}

// 吃饭函数
function eat() {
    console.log('可以吃饭了');
}

// 主函数
function main() {
    orderWaiMai(() => {
        cookWaiMai(() => {
            sendWaiMai(() => {
                eat();
            });
        });
    });
    watchVideo();
}

main();

        我们这是执行五个任务,可以看到主函数中由于异步函数需要层层嵌套,如果是几万几十万任务呢?是不是代码就嵌套的没边了!!!这种现象就叫做回调地狱

为什么需要promise?

        由上面的代码我们就可以发现为什么需要promise了吧?promise主要为了优雅的处理异步操作,它可以通过链式调用实现异步,使得代码看起来很好维护。解决回调地狱的问题。

如果用promise来写我们上面的例子的话

// 点外卖函数
function orderWaiMai() {
    return new Promise((resolve) => {
        console.log('点外卖');
        resolve();  // 点外卖完成,触发下一个操作
    });
}
// 做外卖函数
function cookWaiMai() {
    return new Promise((resolve) => {
        console.log('做外卖');
        setTimeout(() => {
            console.log('外卖做好了');
            resolve();  // 做外卖完成,触发下一个操作
        }, 3000);
    });
}
// 送外卖函数
function sendWaiMai() {
    return new Promise((resolve) => {
        console.log('外卖员送外卖');
        setTimeout(() => {
            console.log('外卖送到了');
            resolve();  // 外卖送到,触发下一个操作
        }, 2000);
    });
}
// 吃饭函数
function eat() {
    console.log('可以吃饭了');
}
// 刷短视频函数
function watchVideo() {
    console.log('刷短视频');
}
// 主函数
function main() {
    orderWaiMai()
        .then(cookWaiMai)  
        .then(sendWaiMai)  
        .then(eat)         
        .catch((error) => {  // 捕获并处理任何可能的错误
            console.error('发生错误:', error);
        });

    // 刷短视频可以在做外卖和送外卖的过程中进行
    watchVideo();
}

main();

        上面的代码是不是相对来说清晰明了了很多!promise使用.then方法对异步任务进行链式回调,除了.then和.catch,promise还有.all,.race等方法

        .all是常考项,它接收一个包含多个promise对象的数组。它会并行执行这三个异步操作,而不是等待第一个操作完成后再执行第二个,依次类推。当所有的promise都成功完成时,Promise.all().then() 回调会被触发,并且返回一个包含所有操作结果的数组。

        .race只要其中的任意一个promise完成(无论是成功还是失败),Promise.race() 就会立即返回,其他的promise会继续执行,但不会影响最终结果。

今天就写到这里吧~  有啥错误的地方希望大家可以积极指正!!

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

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

相关文章

【笔记】自动驾驶预测与决策规划_Part7_数据驱动的预测方法

文章目录 0. 前言1. 多模态传感器的编码方式1.1 栅格化表示1.2 向量化表示 Vectornet1.3 基于点云或者多模态输入的预测1.4 基于Transformer的方法 2. 网络输出的表达形式2.1 多模态轨迹回归2.2 轨迹分类2.3 轨迹回归轨迹分类2.4 目标点预测 3.场景级别的预测和决策3.1 论文&am…

回溯法经典难题解析

本文将通过几个经典的回溯问题,展示回溯算法的应用及其在解决问题时的核心思想和技巧。这些问题包括全排列、全排列II、N皇后以及数独问题,本文将分别介绍每个问题的思路与实现。 46. 全排列 给定一个不含重复数字的数组 nums ,返回其 所有…

无线图传下的低延迟视频传输播放技术探讨

技术背景 无线图传技术即无线图像传输技术,是指不用布线(线缆)利用无线电波来传输图像数据的技术。 一、工作原理 无线图传技术主要涉及图像采集、编码、调制、发射、接收、解调、解码和图像显示等环节。 图像采集:通过摄像头…

软件测试面试之常规问题

1.描述一下测试过程 类似题目:测试的生命周期 思路:这是一个“范围”很大的题目,而且回答时间一般在3分钟之内,不可能非常详细的描述整个过程,因此答题的思路要从整体结构入手,不要过细。为了保证答案的准确性,可以引…

C++从零到满绩——类和对象(中)

目录 1>>前言 2>>构造函数(我称之为初始化函数) 3>>析构函数(我称之为销毁函数) 4>>拷贝构造函数(我称之为复制函数) 5>>运算符重载 5.2>>赋值运算符重载 ​编辑…

内网渗透横向移动1

1.信息收集 (1)判断域控 shell net time /domain shell ping OWA2010CN-God.god.org (2)主机探测 浏览探测->网络探测 主机列表显示: (3)域用户收集: shell net user /domain…

Edify 3D: Scalable High-Quality 3D Asset Generation 论文解读

目录 一、概述 二、相关工作 1、三维资产生成 2、多视图下的三维重建 3、纹理和材质生成 三、Edify 3D 1、文本生成多视角图像的扩散模型 2、文本和多视角图像生成法线图像的ControlNet 3、重建与渲染模型 4、多视角高分辨率RGB图像生成 四、训练 1、训练过程 2、…

微软正在测试 Windows 11 对第三方密钥的支持

微软目前正在测试 WebAuthn API 更新,该更新增加了对使用第三方密钥提供商进行 Windows 11 无密码身份验证的支持。 密钥使用生物特征认证,例如指纹和面部识别,提供比传统密码更安全、更方便的替代方案,从而显著降低数据泄露风险…

词云图大师(WordCloudMaster): 探索创意无限的词云世界!

在信息化时代,如何以一种新颖且富有创意的方式表达数据、文字或想法?答案是词云图!而词云图大师(WordCloudMaster),正是您的绝佳选择。 无论是个人创意项目,还是专业工作中的数据可视化,词云图大师都能以强…

pycharm使用debug的时候遇到断点不停的问题

1.首先尝试在程序最开头打断点,检查是否能停下,如果可以,看第二步 2.尝试在你打期望停下的代码附近print("1111111")看看是否输出了这个字符串,验证程序确实走到这一步了 3.如果能走到那一步,但是依然没有…

Epipolar-Free 3D Gaussian Splatting for Generalizable Novel View Synthesis 论文解读

目录 一、概述 二、相关工作 1、单场景3DGS 2、跨场景生成3DGS 3、几何方法解决3D任务 三、eFreeSplat 1、预训练跨视角模块 2、无外极线跨视角交互感知模块 3、迭代跨视角高斯对齐 4、高斯参数预测 一、概述 该论文设计了一种不依赖于极线约束的情况实现可推广的新视…

c++视频图像处理

打开视频或摄像头 打开指定视频 /*VideoCapture(const String &filename, apiPreference);filename:读取的视频或者图像序列的名称apiPreference:读取数据时设置的属性*/ VideoCapture video; //定义一个空的视频对象 video.open("H:/BaiduNetdiskDownlo…

青少年强网杯线上ctf-crypto-wp

目录 AliceAES Classics AliceAES 进入环境,给一个key值和一个iv值 意思是,用这两个值AES编码‘Hello,Bob!’,然后把结果输入进去 把key值和iv值带入解得 然后得出flag Classics 题目是下面这个 根据他解码的顺序,反着写出编码顺序 一开…

工具使用_docker容器_crossbuild

1. 工具简介 2. 工具使用 拉取 multiarch/crossbuild 镜像&#xff1a; docker pull multiarch/crossbuild 创建工作目录和示例代码&#xff1a; mkdir -p ~/crossbuild-test cd ~/crossbuild-test 创建 helloworld.c &#xff1a; #include <stdio.h>int main() …

【Linux系统】—— 基本指令(三)

【Linux系统】—— 基本指令&#xff08;三&#xff09; 1 一切皆文件2 重定向操作2.1 初始重定向2.2 重定向的妙用2.3 追加重定向2.4 输入重定向2.5 一切皆文件与重定向结合 3 Linux 中的文件类型4 日志5 「more」命令6 「less」命令7 「head」与「tail」7.1 查看文件开头和结…

搜索引擎中广泛使用的文档排序算法——BM25(Best Matching 25)

在搜索场景中&#xff0c;BM25能计算每个文档与查询的匹配度&#xff0c;从中找出最相关的文档&#xff0c;并按相关性高低排序展示。 要理解BM25&#xff0c;需要掌握以下几个关键概念&#xff1a; 1. 词频&#xff08;Term Frequency, TF&#xff09;&#xff1a;某关键词在文…

Jupyter Notebook的安装和配置提示功能

Python开发环境搭建conda管理环境-CSDN博客 安装anaconda和对接到编译器的教程可以看上面这一篇 Jupyter Notebook是一种交互式计算环境&#xff0c;它允许用户在单个文档中编写和执行代码、方程、可视化和文本。与其他编译器相比&#xff0c;Jupyter Notebook的突出点在于其交…

Oracle SQL*Plus中的SET VERIFY

在 Oracle SQL*Plus 中&#xff0c;SET VERIFY ON 和 SET VERIFY OFF 是两个用于控制命令执行前后显示变量值的命令。这些命令主要用于调试和验证 SQL 脚本中的变量替换情况。 一、参数说明 1.1 SET VERIFY ON 作用&#xff1a;启用变量替换的验证功能。当启用时&#xff0c;S…

【C】错误的变量定义导致sprintf()‌输出错误

问题描述 刚刚写一个用AT指令透传相关的函数&#xff0c;需要用到sprintf()‌拼接字符串。 结果发现sprintf()‌拼接出来的内容是错误的&#xff0c;简化后的代码如下&#xff1a; const char AT_CIPSEND_FIX_LENGTH_HEADER[11] "ATCIPSEND"; // 错误的&#xff0…

【PHP】部署和发布PHP网站到IIS服务器

欢迎来到《小5讲堂》 这是《PHP》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言安装PHP稳定版本线程安全版解压使用 PHP配置配置文件扩展文件路径…