Promise静态方法,then的顺延,resolve函数

本文详细介绍了Promise的几种静态方法,包括Promise.resolve(), Promise.reject(), Promise.all(), Promise.allSettled(), Promise.race() 和 Promise.any() 的使用场景及作用,并探讨了then的顺延机制以及resolve函数在不同参数情况下的表现。

一. Promise的静态方法都有哪些,各自有什么作用?

  1. Promise.resolve()
    直接创建一个成功的promise
let p = Promise.resolve("成功了");
    console.log(p);
    p.then(res=>{
        console.log(res);//失败了
    })
  1. Promise.resolve()
    直接创建一个失败的promise
 let p = Promise.reject("失败了");
    console.log(p);
    p.then(res => {
        console.log('res:',res);
    }).catch(err=>{
        console.log('err:',err);//err: 失败了
    })
  1. Promise.all()
    作用:
    1.all中放N个promise
    2.all表示所有的promise都成功后,得到所有的promise成功的结果;以数组的形式输出
    3.如果有一个先失败了,直接得到的最先失败的promise失败的结果;
// 创建三个Promise
    const p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            // resolve("p1 resolve")
            reject("p1 reject error")
        }, 2000)
    })
    const p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            // resolve("p2 resolve")
            reject("p2 reject error")
        }, 3000)
    })
    const p3 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p3 resolve")
        }, 5000)
    })
    Promise.all([p1,p2,p3]).then(res=>{
    console.log('res:',res);
    }).catch(err => {
        console.log("err:", err);
    })
  1. Promise.allSettled()
    作用:得到所有的proise的结果,不管是成功还是失败
	const p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            // resolve("p1 resolve")
            reject("p1 reject error")
        }, 3000)
    })
    const p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            // resolve("p2 resolve")
            reject("p2 reject error")
        }, 2000)
    })
    const p3 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("p3 resolve")
        }, 5000)
    })
    // allSettled 得到所有的proise的结果,不管是成功还是失败
    Promise.allSettled([p1, p2, p3]).then(res => {
        console.log("res:", res);
    }).catch(err => {
        console.log("err:", err);
    })
  1. Promise.race()
    作用:不管成功还是失败,会得到第一个先执行完的promise的结果
  2. Promise.any()
    作用:要么显示最成功的promise结果,如果promise都失败,就显示所有promise都失败了

二. 你是如何理解then的顺延的?

  • 以下方代码为例,promise是失败的,需要走then的第2个回调函数,但是第2个回调函数是null,所以就会顺延到下一个then的第2个回调函数.
  • 如果上一个then没有处理,就会自动顺延到下一个then的回调中
let promise = new Promise((resolve, reject) => {
        // resolve("成功了")
        reject("失败了")
    });
    promise.then(value1 => {
        console.log("value1:", value1);
    }, null).then(value2 => {
        console.log("value2:", value2);
    }, err2 => {
        console.log("err2:", err2);
    })
 let promise = new Promise((resolve, reject) => {
        resolve("成功了")
    });
    promise
        .then(null, err1 => {
            console.log("err1:", err1);
        })
        .then(null, null)
        .then(null, null)
        .then(null, null)
        .then(value2 => {
            console.log("value2:", value2);
        }, err2 => {
            console.log("err2:", err2);
        })

三. 调用resolve函数,一定得到一个成功的promise吗?

不一定

  1. 如果resolve中的参数是一个普通值,例如字符,数字,数组,对象等。那promise是成功的。
  2. 当resolve 参数是一个promise,最终promise是成功还是失败,取决于你传递的promise是成功还是失败。
  3. 当resolve的参数 是一个thenable,promise是成功还是失败取决于,thenable是成功还是失败
let promise = new Promise((resolve, reject) => {
        // 1)传递一个普通值,字符串
        // resolve("包包")
        // resolve(123)
        // resolve(["malu"])
        resolve({name:"malu"})
    });
    promise.then(value => {
        console.log("value:", value);
    }, err => { })
let p = new Promise((resolve, reject) => {
        setTimeout(() => {
            // resolve("p的resolve")
            reject("p的reject")
        }, 2000)
    });
    let promise = new Promise((resolve, reject) => {
        resolve(p)
    });
    promise.then(value => {
        console.log("value:", value);
    }, err => {
        console.log("err:", err);
    })
 let promise = new Promise((resolve, reject) => {
        resolve({
            then(resolve, reject) {
                // resolve("包包")
                reject("没钱")
            }
        })
    });
    promise.then(value => {
        console.log("value:", value);
    }, err => {
        console.log("err:", err);
    })```

### JavaScriptPromise静态方法使用说明 #### 1. **Promise.all** `Promise.all` 是一种用于并发执行多个异步操作的方法。它接收一个可迭代对象(通常是数组),其中每个元素都是一个 `Promise` 对象。只有当所有的 `Promise` 都成功解决时,返回的 `Promise` 才会进入 fulfilled 状态,并返回一个包含所有结果的数组[^1]。 如果其中一个 `Promise` 被拒绝,则整个 `Promise.all` 返回的结果会被立即拒绝,并且只保留第一个被拒绝的错误信息[^4]。 ```javascript const promise1 = Promise.resolve(3); const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'Error')); const promise3 = Promise.resolve('foo'); Promise.all([promise1, promise2, promise3]) .then(values => console.log(values)) .catch(error => console.error(error)); // 输出 "Error" ``` --- #### 2. **Promise.allSettled** 与 `Promise.all` 类似,`Promise.allSettled` 同样接收一组 `Promise` 并等待它们全部完成。然而,无论这些 `Promise` 是否被拒绝或解决,最终都会返回一个表示所有 `Promise` 结果的数组[^5]。 这个特性使得开发者可以更方便地处理那些可能失败的操作而无需中断流程。 ```javascript const promises = [ Promise.resolve(3), Promise.reject('Error'), Promise.resolve('foo') ]; Promise.allSettled(promises).then(results => { results.forEach(result => { if (result.status === 'fulfilled') { console.log(result.value); // 成功的结果 } else { console.error(result.reason); // 失败的原因 } }); }); ``` --- #### 3. **Promise.race** `Promise.race` 接收一个由多个 `Promise` 组成的可迭代对象,并返回一个新的 `Promise` 实例。一旦有任意一个输入的 `Promise` 进入 resolved 或 rejected 状态,新创建的 `Promise` 将立刻采用相同的状态和值[^3]。 这种方法适用于需要快速响应的情况,比如设置超时机制或者监听最先完成的任务。 ```javascript var p1 = new Promise(function(resolve) { setTimeout(() => resolve("fulfilled"), 200); }); var p2 = new Promise(function(resolve, reject) { setTimeout(() => reject("rejected"), 100); }); Promise.race([p1, p2]).catch(reason => console.log(reason)); // 输出 "rejected" ``` --- #### 4. **Promise.resolve** `Promise.resolve(value)` 方法用来将现有值转换为已经成功的 `Promise` 实例。如果传入的是另一个 `Promise`,则直接返回该 `Promise`。 这是简化代码结构的一种方式,在某些场景下可以直接跳过显式的构造器调用。 ```javascript let value = 42; let resolvedPromise = Promise.resolve(value); resolvedPromise.then(val => console.log(val)); // 输出 42 ``` --- #### 5. **Promise.reject** 类似于 `Promise.resolve`,但是 `Promise.reject(reason)` 创建了一个已经被拒绝的 `Promise` 实例。 通常用于模拟异常情况下的测试环境或者是手动触发错误路径。 ```javascript let rejectedPromise = Promise.reject(new Error('Something went wrong')); rejectedPromise.catch(err => console.error(err.message)); // 输出 "Something went wrong" ``` --- #### 6. **Promise.any** `Promise.any` 和 `Promise.all` 相反,只要有一个 `Promise` 成功即可让整体变为成功状态。但如果所有的 `Promise` 都失败了,则会抛出聚合型错误 AggregateError。 这种模式适合于尝试多种备选方案直到找到可行解的情形。 ```javascript const successfulPromises = [ Promise.reject('Fail 1'), Promise.resolve('Success!'), Promise.reject('Fail 2') ]; Promise.any(successfulPromises) .then(result => console.log(result)) // 输出 "Success!" .catch(errors => console.error(errors)); ``` --- ### 总结 上述介绍涵盖了常见的几种 `Promise` 静态方法及其典型应用场景。每种方法都有特定用途,合理选用能够显著提升程序效率以及健壮性。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值