【js】es6中关于promise对象

1.Promise 的三种状态
Pending----Promise 对象实例创建时候的初始状态
Fulfilled---- 可以理解为成功的状态
Rejected---- 可以理解为失败的状态
2.promise 的链式调用
每次调用返回的都是一个新的 Promise 实例 (这就是 then 可用链式调用的原因);
如果 then 中返回的是一个结果的话会把这个结果传递下一次 then 中的成功回调;
如果 then 中出现异常, 会走下一个 then 的失败回调;
在 then 中使用了 return,那么 return 的值会被 Promise.resolve() 包装;
then 中可以不传递参数,如果不传递会透到下一个 then 中;
catch 会捕获到没有捕获的异常

let p = function (v) {
    let x = null;
    return new Promise((resolve, reject) => {
        if (v) {
            resolve(v)
        }
        reject(v);
    })
}

p(2).then(res => {
        x = '233';
        return p(res + 1)
    })
    .then(res => {
        console.log(x);
        return p(res + 2)
    })
    .then(res => {
        console.log(x);
        console.log(res);
    })

p(2).then(res => {
        return p()
        //如果 then 中出现异常, 会走下一个 then 的失败回调;
        //由于下一个 then 没有失败回调,就会继续往下找,如果都没有,就会被 catch 捕获到
    })
    .then(res => {
        return p(res + 1)
    })
    .then(res => {
        console.log(res);
    })
    .catch(err => {
        console.log('err', err)
    })

3.promise的缺点:比如无法取消 Promise,错误需要通过回调函数捕获。
4.Promise.all()
Promise.all方法接受一个数组作为参数,
p1、p2、p3都是 Promise 实例,如果不是,
就会先调用下面讲到的Promise.resolve方法,
将参数转为 Promise 实例,再进一步处理。
(Promise.all方法的参数可以不是数组,
但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。)

eg:
p的状态由p1、p2、p3决定,分成两种情况。

(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,
此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。

(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,
此时第一个被reject的实例的返回值,会传递给p的回调函数。

const p1 = new Promise((resolve, reject) => {
    resolve('p1');
})

const p2 = new Promise((resolve, reject) => {
    reject('p2'); //第一个被reject的实例的返回值,会传递给p的回调函数
})

const p3 = new Promise((resolve, reject) => {
    reject('p3');
})

const p = Promise.all([p1, p2, p3]);
p.then(res => {
    console.log('p all', res);
}).catch(err => {
    console.log('err', err)
})

如果作为参数的 Promise 实例,
自己定义了catch方法,
那么它一旦被rejected,
并不会触发Promise.all()的catch方法。

const p1 = new Promise((resolve, reject) => {
        resolve('hello');
    })
    .then(result => result)
    .catch(e => e);

const p2 = new Promise((resolve, reject) => {
        throw new Error('报错了');
    })
    .then(result => result)
    .catch(e => e);

Promise.all([p1, p2])
    .then(result => console.log(result))
    .catch(e => console.log(e));

笔记摘自:
http://es6.ruanyifeng.com/#docs/promise#Promise-all
https://www.infoq.cn/article/zwowtega7KjC4Ad-trp4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值