Promise

简介

  • ES6将某一件事情可以发生异步的时候,分为2ge阶段unsettled未决阶段和settled已决阶段 事情总是从未决阶段逐步发展到已决阶段,并且未决阶段有控制通往已决阶段的能力,可以决定事情最终走向的状态
  • ES6将程序分为3中状态:pending resolved rejected pending状态:挂起(等待) 处于未决阶段,表示事情还在挂起最终的结果还没有出现 resolved状态:已处理 处于已决阶段,表示整个事情已经出现了结果,并且可以按照正常的逻辑进行下去的结果 rejected状态:已拒绝 处于已决阶段,表示整个事情已经出现了结果,并且无法按照正常的逻辑进行下去的结果
  • 把事情从pending状态推向resolved状态的过程中可能会传递一些数据,这些数据一般为真实有效数据 把事情从pending状态推向rejected状态的过程中可能会传递一些数据,这些数据一般为错误信息
  • 当事情已经到达已决阶段后,通常要进行后续处理,不同的已决阶段,决定了不同的后续处理 resolved 这是一个正常的已决状态,后续处理表示为thenable rejected 这是一个非正常的已决状态,后续处理表示为catchable 后续处理可能会有多个,因此就会形成任务队列,这些后续处理会按照顺序,当到达对应的状态依次执行

使用 new 来创建一个promise对象 

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

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

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

 Promise的API

then()方法

then 方法就是把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数

而 Promise 的优势就在于这个链式调用。我们可以在 then 方法中继续写 Promise 对象并返回,然后继续调用 then 来进行回调操作
 

reject()方法:
我们通过 resolve 方法把 Promise 的状态置为完成态(Resolved),这时 then 方法就能捕捉到变化,并执行“成功”情况的回调。
而 reject 方法就是把 Promise 的状态置为已失败(Rejected),这时 then 方法执行“失败”情况的回调(then 方法的第二参数)

回调函数使用

        //实例生成后用then方法指定相应状态对应的回调函数
        promise.then(function(success) {
            //success
        }, function(error) { //第二个为可选参数,可不写
            //failure
        })

        // then的链式调用: promise.then() 返回的也是一个promise对象, 也具有两个状态
        promise.then(function(success) {
            return 'name'; //前一个then方法的返回值传给下一个then作为参数
        }).then(function(name) { //获取上一个then传来的name
            console.log(name);
        }, function(error) { //错误时进行调用
            console.log('rejected');
        })

 

        // Promise本质上就是一个构造函数
        const pro = new Promise(function(resolve, reject) {
            // 1.未决阶段  同步代码
            // 通过调用resolve函数将promise从pending状态推向resolved状态
            // 通过调用reject函数将promise从pending状态推向rejected状态
            // 2.resolve和reject只能使用一个,如果使用多个,也只有第一个有用
            // 3.传递的参数只能有一个,表示推向出去的数据
            // reject("!") 
            resolve([true, "123"])
        })
        console.log(pro)
        pro.then(function(data) {
            // thenable resolve推出的结果
            console.log(data)
        }, function(err) {
            // catchable reject退出的结果
            console.log(err)
        })

### Promise 在异步编程中的角色 Promise 是一种用于处理异步操作的解决方案,它在语法上是一个 ES6 的原生对象,代表了未来将要发生的事件,用来传递异步操作的消息。从本质上讲,Promise 是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。 Promise 提供了一个统一的 API,使得各种异步操作可以使用相同的方法进行处理。这意味着无论异步操作的结果是成功还是失败,都可以通过 Promise 的 API 来处理这些结果。 Promise 对象有两个主要的状态变化:从 pending(等待)变为 fulfilled(已成功)或 rejected(已失败)。一旦状态改变,就不会再变,这保证了 Promise 的结果是不可逆的。 下面是一个简单的 Promise 使用示例: ```javascript var p1 = new Promise(function(resolve, reject) { // 异步操作 resolve('OK'); // 或者 reject('Error'); }); p1.then(function(rs) { // 如果 p1 的状态变为 resolved,则执行此函数,并且 rs 会接收到 'OK' }).catch(function(rs) { // 如果 p1 的状态变为 rejected,则执行此函数,并且 rs 会接收到 'Error' }).finally(function() { // 不论 p1 的状态如何,finally 中的函数一定会执行 }); ``` 此外,Promise 还提供了 `Promise.all()` 方法,该方法接收一个 Promise 数组,并返回一个新的 Promise。只有当数组中的所有 Promise 都成功完成时,这个新的 Promise 才会成功,并且其结果是一个包含所有 Promise 结果的数组。 ```javascript let p1 = new Promise((resolve, reject) => { resolve('OK'); }); let p2 = Promise.reject('error'); // 修改为 reject 以展示错误处理 let p3 = Promise.resolve('Oh Year!'); const result = Promise.all([p1, p2, p3]); console.log(result); ``` 在这个例子中,由于 p2 被设置为 rejected,所以整个 Promise.all 的结果也会是 rejected。如果希望即使有一个失败也要继续执行其他 Promise,可以考虑使用 `Promise.allSettled()` 方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值