• 面试题:Promise用法及理解


    一. Promise由来

    es6之前,我们处理异步函数非常麻烦,需要自己定义回调函数让使用者传入,才可以进行正常的回调;但是这样做没有一个固定的格式,那么不同开发者开发的方法,需要传入的回调函数顺序,格式也各不相同,对于需要使用其他框架的开发者来说非常痛苦,学习成本很高;而且ajax很容易出现回调地狱,es6推出了Promise类,就是为了解决这一现象的。

    二. Promise解决异步

    Promise是es6新推出的一个类,顾名思义就是许诺,承诺;意思是给开发者一个承诺,代码执行成功或者失败,都会执行规定好的回调函数。

    写法:promise类中需要传入一个函数,函数内部也有两个参数,分别是resolve和reject
    .resolve() 将Promise对象的状态从“未完成”变为“成功”
    .rejected() 将Promise对象的状态从“未完成”变为“失败”
    如果不调用这两个方法,那么promise会直接结束。

    function fun(num) {
    	const promise = new Promise((resolve, reject) => {
    		setTimeout(() => {
    			if (num > 0) {
    				resolve(`${num},大于0`)
    			} else {
    				reject(`${num},小于0`)
    			}
    		})
    	})
    }
    
    fun(10).then(res => console.log(res))
    fun(-1).catch(err => console.log(err))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    三. Promise状态区分

    1. pending:执行时状态
    2. fulfilled:已完成,执行resolve
    3. rejected:操作失败,执行reject

    四. resolve传入不同值的区别

    1. 传入正常数值或者对象,会作为.then回调函数的参数
    2. 传入promise对象,那么会看这个对象执行的结果
    3. 传入对象带then方法,那么会执行该方法,根据结果决定状态

    五. 多次调用then、catch

    then、catch返回值是新的promise,所以可以多次调用。(then有第二个参数err,可以代替catch,区别就是如果then中出现异常只能catch处理)

    const promise = new Promise((resolve, reject) => {
    	resolve('aaa')
    })
    
    promise.then(res=>{
    	console.log(res) // aaa
    	return 'bbb'
    }).then(res => {
    	console.log(res) // bbb
    })
    
    promise.then(res => {
    	console.log(res) // aaa
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    六. finally

    不管Promise是什么状态,都会执行finally!

    七. all、allSettled方法

    Promise类提供了一个all方法,可以把多个promise实例放到一起,形成新的Promise,新Promise的状态由内部所有Promise决定,当内部都是fulfilled状态,它才是fulfilled,把所有Promise返回值放到一个数组里返回;有一个rejected,那就是rejected

    const p1 = new Promise()
    const p2 = new Promise()
    const p3 = new Promise()
    
    Promise.all([p1,p2,p3]).then(res=> {
    	console.log("all promise res:", res)
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    allSettled方法就是返回每个promise的结果,无论状态如何

        Promise.allSettled([p1, p2, p3]).then(res => {
          console.log("all settled:", res)
        })
    
    • 1
    • 2
    • 3
  • 相关阅读:
    Java手写希尔排序和算法案例拓展
    Docker 的数据管理与Docker 镜像的创建
    算法训练营64-图论-深度优先优先搜索(dfs)-广度优先搜索(bfs)
    QGIS编译(跨平台编译)之五十七:Qt Creator环境下qgis_app库的pro文件
    你为什么做测试/开发程序员?还能回想出来吗......
    C++ - set 和 map 的实现(下篇)- set 和 map 的迭代器实现
    Seata-TCC模式
    SpringBoot项目嵌入RabbitMQ
    【云原生--Kubernetes】kubectl命令详解
    2022年最新四川水利水电施工安全员考试题库及答案
  • 原文地址:https://blog.csdn.net/q879936814/article/details/126395041