Promise

Promise是异步编程的一种解决方案,解决回调地狱问题,提供链式调用方式。它是一个对象,保存异步操作的结果,有三种状态:初始、成功、失败。状态由异步操作结果决定且不可逆。通过new Promise创建实例,传入resolve和reject回调函数。then和catch方法处理成功和失败情况,all和race方法分别处理并行执行和首个完成的异步操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是promise

promise是异步编程的一种方案,解决了地狱回调的问题,是一种链式调动的方式

  • Promise 简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

  • promise 是一个对象,从它可以获取异步操作的的最终状态(成功或失败)。

  • Promise是一个构造函数,对外提供统一的 API,自己身上有all、reject、resolve等方法,原型上有then、catch等方法。

名词约定

  • promise(首字母小写)对象指的是“Promise实例对象”
  • Promise 首字母大写且单数形式,表示“Promise构造函数”
  • Promises 首字母大写且复数形式,用于指代“Promises规范”

Promise的两个特点

Promise对象的状态不受外界影响

1)pending 初始状态

2)fulfilled 成功状态

3)rejected 失败状态

Promise 有以上三种状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态

Promise的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由 pending变成fulfilled或者由pending变成rejected

使用 new 来创建一个promise对象。

Promise接受一个「函数」作为参数,该函数的两个参数分别是resolvereject。这两个函数就是就是「回调函数」

resolve函数的作用:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

reject函数的作用:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去

  • then()方法: then 方法就是把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。
  • catch()方法: 当执行 resolve 的回调(也就是上面 then 中的第一个参数)时,如果抛出异常了(代码出错了),那么也不会报错卡死 js,而是会进到这个 catch 方法中。
  • all()方法: Promiseall 方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。
  • race()方法: race 按字面解释,就是赛跑的意思。race 的用法与 all 一样,只不过 all 是等所有异步操作都执行完毕后才执行 then 回调。而 race 的话只要有一个异步操作执行完毕,就立刻执行 then 回调。

promise简单举例

//Promise异步封装ajax
<script>
    function Feach(method,  ) {
        let p = new Promise((resolve, reject) => {
            // 手写原生ajax
            let xhr = new XMLHttpRequest(); //创建ajax请求
            xhr.open(method, url, true);  //发起请求
            xhr.send(null); //发送请求,发送的参数是空的
            //异步回调函数
            xhr.onreadystatechange = function () {

                //readystate:请求返回五种状态
                // 0(未初始化):还没有调用send()方法
                // 1(载入):已调用send()方法,正在发送请求
                // 2(载入完成):send()方法执行完成,已经接收全部响应内容
                // 3(交互):正在解析响应内容
                // 4(完成):响应内容解析完成,可以在客户端调用了
                if (xhr.readyState == 4 && xhr.status == 200) {  
                    resolve(xhr.responseText);  //responseText:获取字符式的响应数据 responseXML:获取XML形式的响应数据
                } else if (xhr.status == 400) {
                    reject('失败')
                }
            }
        })
        return p;
    }

    let url = "http://wthrcdn.etouch.cn/weather_mini?city=%E5%8C%97%E4%BA%AC";

    Feach('get',url).then(res => {
        console.log(res)
    }, err => {
        console.log(err)
    })

</script>
<script>
	//promise异步加载图片
	
    // 创建一个函数
    function requestImg(){
        // 创建一个promise对象
        var p= new Promise(function(resolve,reject){
            // 创建一个图像对象
            var img=new Image();
            // 图像在页面加载完成后执行成功的回调
            img.onload=function(){
                resolve(img);
            }
            img.src="./qzone.png"
        });
        return p;
    }

    //延时函数,用于给请求计时
    function timeout(){
        // 创建一个promise对象,如果请求超时则执行错误的回调
        var p=new Promise(function(resolve,reject){
            setTimeout(()=>{
                let span=documnet.createElement('span')
                span.innerText='加载失败'
                resolve(span);
            },5000);
        });
        return p;
    }
    // promise执行一次后如果执行成功就执行then方法,否则执行catch方法
    Promise.race([requestImg(),timeout()]).then(function(results){
        console.log(results);
    }).catch(function(reason){
        console.log(reason)
    });
    //上面代码requestImg函数异步请求一张图片,timeout函数是一个延时5秒的异步操作,我们将他们在一起放在race中赛跑
    //如果5秒内图片请求成功那么便进入then方法,执行正常的流程。
    // 如果5秒内图片还未成功返回,那么则进入catch,报“图片请求超时”的信息

</script>
### Promise 的工作原理 Promise 是 JavaScript 中处理异步操作的一种核心机制,其设计基于状态管理和回调注册的思想。Promise 本质上是一个对象,表示一个异步操作的最终完成(或失败)及其结果值。Promise 有三种状态:`pending`(等待态)、`fulfilled`(成功态)和 `rejected`(失败态)。一旦状态发生变化,就不会再变,这种状态的不可逆性是 Promise 的核心特性之一[^2]。 在内部实现上,Promise 采用了发布-订阅模式。当异步操作尚未完成时,Promise 处于 `pending` 状态,此时可以通过 `then` 方法注册回调函数,等待状态变为 `fulfilled` 或 `rejected` 时触发相应的回调。这种机制类似于事件监听,但更结构化和可控,避免了传统回调地狱的问题[^3]。 Promise 的执行是同步的,构造一个 Promise 实例时,其传入的执行函数会立即执行,但其内部的异步操作(如 setTimeout)会进入事件循环的微任务队列,等待当前同步任务执行完毕后才被处理。这使得 Promise 具有良好的调度顺序[^1]。 ### Promise 的使用方法 #### 基本结构 ```javascript const promise = new Promise((resolve, reject) => { // 异步操作 if (/* 成功 */) { resolve(value); // 成功状态 } else { reject(error); // 失败状态 } }); ``` #### 链式调用 Promise 支持链式调用,通过 `then` 方法可以依次处理异步操作的结果,每个 `then` 返回一个新的 Promise,从而实现异步流程控制: ```javascript promise .then(value => { console.log('Success:', value); return value + 1; }) .then(newValue => { console.log('New value:', newValue); }) .catch(error => { console.error('Error:', error); }); ``` #### 错误处理 Promise 的错误处理通过 `catch` 方法进行,它可以捕获链式调用中任意一个环节抛出的错误。建议始终使用 `catch` 来统一处理错误,以避免未捕获的 Promise rejection 导致程序崩溃。 #### 静态方法 Promise 构造函数自身提供了一些静态方法,用于处理多个 Promise 的组合和控制: - `Promise.resolve(value)`:返回一个以给定值解析的 Promise。 - `Promise.reject(reason)`:返回一个以给定原因拒绝的 Promise。 - `Promise.all(iterable)`:接收一个 Promise 数组,全部成功才成功,有一个失败就立即失败。 - `Promise.race(iterable)`:接收一个 Promise 数组,只要有一个 Promise 状态改变,就触发后续操作。 ### 常见问题与注意事项 - **避免未处理的 rejection**:如果一个 Promise 被拒绝但没有对应的 `catch` 捕获,可能导致程序运行异常。应始终为 Promise 链添加错误处理。 - **链式调用中的返回值**:在 `then` 中返回的值会作为下一个 `then` 的输入。若返回的是另一个 Promise,则会等待该 Promise 解析后再继续执行链式流程。 - **异步顺序问题**:由于 Promise 使用微任务队列,其回调执行顺序优先于 `setTimeout` 等宏任务,但在多个 Promise 回调之间仍然遵循注册顺序。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值