promise规范及应用

news2024/11/18 20:00:46

##promise解析

*啥是异步?

        //异步执行
        let count = 1
        let timer = setTimeout(function () {
            count++
            console.log('in', count);
        }, 1000);
        console.log('out');
        // out=>1000=>in

        //循环执行
        let count = 1
        let timer = setInterval(function () {
            count++
            console.log('in', count);
        }, 1000);
        console.log('out');
        setTimeout(function () {
            clearInterval(timer)
            console.log('clear');//第5秒后清空循环器
        }, 5000);
        //看不见的队列,存放着需要默默执行的命令

###1.进程&线程

 

####a.概念 & 区别

####b.面试题

*映射到前端-浏览器

chrome新开一个窗口,是进程还是线程(可以理解为互相协作,相互之间独立)?=>进程(可以理解为完整的独立体系)

*发散

方向一:窗口(进程间)通信?=>storage | cookie=>多种存储的区别=>应用场景=>结合简历项目

方向二:浏览器原理(中高级岗位面试居多)

###2.EVENT-LOOP

####a.执行栈

*js单线程语言,单步执行

        function func2() {
            throw new Error('please check your call stack');
        }
        function func1() {
            func2() 
        }
        function func() {
            func1()
        }
        func()

 ####b.面试题

 

        //    执行顺序
        setTimeout(() => {
            console.log('count');//5.宏任务2
        }, 0);

        new Promise(resolve => {
            console.log('new Promise');//1.属于同步进入主线程 宏任务1
            resolve()
        }).then(() => {
            console.log('Promise then');//3.微任务1
        }).then(() => {
            console.log('Promise then then');//4.微任务2
        })
        console.log('hi');//2.同步+宏任务1
        //任务拆分 : macro | micro
        //同步 | 异步

 

event-table:可以.理解为异步待执行

event queue:异步队列

同步的走同步的执行栈,异步的走异步的事件队列.

###promise化=>链式化

####a.理论-回调地狱

       request.onreadystatechange = () => {
            //回调后处理
        }
        //加时延
        setTimeout(() => {
            request.onreadystatechange = () => {
                //回调后处理
                setTimeout(() => {
                    //处理
                    request.onreadystatechange = () => {
                        //......
                    }
                });
            }
        });

        //promise化
        new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('ok')
            });
        }).then(res => {
            request()
        }).catch(err => {
            console.log(err);
        })

 多个异步顺序执行=>复合链式调用

       function wait500(input) {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve(input + 500)
                }, 500);
            })
        }

        function wait1000(input) {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve(input + 1000)
                }, 1000);
            })
        }

        const p = new Promise((resolve, reject) => {
            resolve(1)
        })
        p.then(wait500)
            .then(wait1000)
            .then(wait500)
            .then(wait1000)
            .then(res => {
                console.log('end', res);
            })

        //全部执行完成回调
        Promise.all([wait500, wait1000]).then(res => {
            console.log('all end', res);
        })
        //有执行完成的立刻操作
        Promise.race()([wait500, wait1000]).then(res => {
            console.log('all end', res);
        })

####b.面试-promise

*1.promise状态 - pedding | fulfilled | rejected

executor(执行器):new Promise的时候立即执行,接收两个参数,resolve | rejected

*2.promise默认状态?状态是如何流转的?-默认是pedding,状态流转:pedding=>fulfilled | pedding=>rejected

内部维护成功value:underfined | thenable | promise

内部维护失败原因resaon

*3.promise返回值?-then方法:接收onFulfilled和onRejected

如果then时,promise已经成功,执行onFulfilled,参数value

如果then时,promise已经失败,执行onRejected,参数resaon

如果then中有异常,执行onRejected

*追问:手写?

        const PENDING = 'PENDING'
        const FULFILLED = 'FULFILLED'
        const REJECTED = 'REJECTED'

        class Promise {
            constructor(executor) {
                //1.默认状态-PENDING
                this.status = 'PENDING'
                //2.内部维护的变量值
                this.value = undefined
                this.reason = undefined

                //成功的回调
                let resolve = value => {
                    //状态流转
                    this.status = FULFILLED
                    this.value = value
                }

                //失败的回调
                let reason = reason => {
                    //状态流转
                    this.status = REJECTED
                    this.reason = reason
                }

                try {
                    executor(resolve, reject)
                } catch (error) {
                    reject(error)
                }
            }

            then(onFulfilled, onRejected) {
                if (this.status === FULFILLED) {
                    onFulfilled(this.value)
                }
                if (this.status === REJECTED) {
                    onFulfilled(this.reason)
                }
            }
        }

        //异步怎么办?
        const PENDING = 'PENDING'
        const FULFILLED = 'FULFILLED'
        const REJECTED = 'REJECTED'

        class Promise {
            constructor(executor) {
                //1.默认状态-PENDING
                this.status = 'PENDING'
                //2.内部维护的变量值
                this.value = undefined
                this.reason = undefined

                //存放回调
                this.onResolvedCallbacks = []
                this.onRejectedCallbacks = []

                //成功的回调
                let resolve = value => {
                    //状态流转
                    this.status = FULFILLED
                    this.value = value
                    this.onResolvedCallbacks.forEach(fn => fn())
                }

                //失败的回调
                let reason = reason => {
                    //状态流转
                    this.status = REJECTED
                    this.reason = reason
                    this.onRejectedCallbacks.forEach(fn => fn())
                }

                try {
                    executor(resolve, reject)
                } catch (error) {
                    reject(error)
                }
            }

            then(onFulfilled, onRejected) {
                if (this.status === FULFILLED) {
                    onFulfilled(this.value)
                }
                if (this.status === REJECTED) {
                    onFulfilled(this.reason)
                }
                if (this.status === PENDING) {
                    //存放队列
                    this.onResolvedCallbacks.push(() => {
                        onFulfilled(this.value)
                    })
                    this.onRejectedCallbacks.push(() => {
                        onFulfilled(this.reason)
                    })
                }
            }
        }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLO学习笔记1. YOLOV1的基本概念

YOLO学习笔记1. YOLOV1的基本概念 一、 YOLO简介二、一些基本概念1. two-stage和one-stage2. 指标分析(1)精度的概念(2)召回率的概念(3)IOU(4)置信度阈值(5) …

成功解决VScode每次只能打开一个文件,即只能打开一个编辑窗口。

成功解决VScode每次只能打开一个文件,即只能打开一个编辑窗口。 解决方案 解决方案 点击文件 --> 首选项 --> 设置 --> 工作台 --> 编辑管理 --> 取消勾选Enable Preview 如下图所示: 下拉,取消勾选Enable Preview

[JVM] 1. 初步认识JVM

核心思想: “Write Once, Run anywhere”. 各种语言通过编译器转换成字节码文件,在JVM上运行。 一、Java虚拟机 Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成…

Netty核心技术十一--用Netty 自己 实现 dubbo RPC

1. RPC基本介绍 RPC(Remote Procedure Call):远程 过程调用,是一个计算机 通信协议。该协议允许运 行于一台计算机的程序调 用另一台计算机的子程序, 而程序员无需额外地为这 个交互作用编程 两个或多个应用程序都分 布在不同的服…

AJAX与axios框架

文章目录 前言案例跨域访问总结❗ 前言 提示:这里可以添加本文要记录的大概内容: 通过 ajax 进行前后端交互 案例 此项目用到了javaweb知识 首先创建JavaWeb项目编写代码: package ajax;import java.io.IOException; import java.util.A…

个人引导页源码带三个按钮可添加

个人引导页源码带三个按钮可添加 简洁优雅引导页

SpingBoot配置文件

普通参数配置 之前用阿里云oss,如果在每一个都程序都写这个 1.代码一旦修改要一个一个改 2.代码复用性低 所以可以配置到springBoot的配置文件来进行对应的读取,这样复用性就高了 赋值Value(和最下面注解功能相同) 在applicat…

淘宝app商品详情原数据API接口【详情页优惠券数据】Python语言示例请求范例,多种语言均支持

首先以Python语言请求示例为介绍 请求示例 # coding:utf-8 """ Compatible for python2.x and python3.x requirement: pip install requests """ from __future__ import print_function import requests # 请求示例 url 默认请求参数已经做U…

密码学学习笔记(十一):哈希函数 - Merkle–Damgård结构

Merkle–Damgrd是一种算法,由Ralph Merkle和Ivan Damgrd提出。它通过迭代调用压缩函数来计算消息的哈希值。 应用 拿SHA-2举例,首先我们需要对需要进行哈希运算的输入做填充,然后将填充后的输入划分为等长的分组,每个分组的长度…

中级课程——SSRF

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言挖掘 前言 挖掘

【网站开发】jq (jquery)实现瀑布流布局

要实现网站瀑布流效果&#xff0c;可以使用HTML、CSS和jquery来完成。下面是一种常见的实现方式&#xff1a; 注意要引入jQuery库。 代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title>…

git下载源码及环境搭建之数据库(二)

学习目标&#xff1a; 数据库 新项目使用 数据库文件 的配置 及相关属性的设置 步骤&#xff1a; 数据库 下图所示为开发时所用数据库 第一步&#xff1a;新建一个数据库 注意&#xff1a; 字符集与排序规则我们应该选择utf-8 相关 选中新创建的表&#xff0c;点击备份—还…

【雕爷学编程】Arduino动手做(06)---KY-038声音传感器模块4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Flutter:网络图像缓存插件——cached_network_image

前言 为什么要使用这个插件&#xff0c;有什么用呢&#xff1f;毕竟官方提供了Image.network来进行网络图片加载 Image.network和CachedNetworkImage都可以用于在Flutter中加载网络图片&#xff0c;但它们之间有一些区别。 Image.network是Flutter核心库提供的一个构造函数&…

趣味:关于AI是否具备自我意识的探究方案之一

随着gpt等其他NLP大语言模型的爆火&#xff0c;AI技术再次成为我们谈论的焦点&#xff0c;AI是一种拟人的、能够通过学习和自我优化执行各种任务的技术&#xff0c;关于ai是否具备自我意识的答案很明显是否定的&#xff0c;以下将使用一个例子来论证的观点 1.实验准备 我们将…

收拾屋子找出10年前的三维教程

明天找个带光驱的电脑&#xff0c;打开看看。那会还是刻盘&#xff0c; 那会我还是小鲜肉&#xff0c;只是喜欢PS2游戏。所以才接触到三维软件&#xff0c;可惜没干这行。现在变成中年大叔了&#xff0c;拿出来玩会。 想当初现在e维网&#xff0c;下载最新的教程。后面电驴里…

高并发下保证接口幂等性的常用策略

接口幂等性问题&#xff0c;对于开发人员来说是一个常见的公共问题。这里分享一些我在项目中用到过的一些方法&#xff0c;给有需要的同学们一个参考。 你是否遇到过以下的场景&#xff1a; 在填写form页面表单时&#xff0c;如果前端没做loading或者防抖操作&#xff0c;保存…

松松商城上线“谷歌英文外链“资源,松松软文推出英文站点资源

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 近期&#xff0c;为了丰富资源&#xff0c;松松商城和松松软文迎来了一系列新的更新。松松商城推出了“谷歌外贸站英文"外链资源&#xff0c;而松松软文则上线了英文站点资源&#xff0c;为用…

MURF20100CT-ASEMI快恢复对管MURF20100CT

编辑&#xff1a;ll MURF20100CT-ASEMI快恢复对管MURF20100CT 型号&#xff1a;MURF20100CT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 恢复时间&#xff1a;50ns 正向电流&#xff1a;20A 反向耐压&#xff1a;1000V 芯片个数&#xff1a;2 引脚数量&#xff1…

场景图生成——RelTR训练自己的数据集

RelTR训练自己的数据集 省流量省时间版本框的标注关系的标注总的 前言Open Images V6的标注格式RelTR中使用的Open Images V6的数据标注格式具体步骤框的标注生成格式关系三元组的生成格式 结束语参考链接 省流量省时间版本 框的标注 共需要创建4个json标注文件 train.json, …