无处不再的Promise

239 阅读3分钟

  • 定义: 包含异步操作结果的对象
  • 状态
    1. 进行中: pending
    2. 已成功:resolved
    3. 已失败:rejected
  • 特点
    • 对象的状态不受外界影响
    • 一旦状态改变就不会再变,任何时候都可以得到这个结果
  • 声明:new Promise((resolve,reject) =>{})
  • 参数
    • resolve: 将状态从未完成变为成功,在异步操作成功时调用,并将异步操作的结果作为参数传递出去

    • reject: 将状态从未完成变为失败,在异步操作失败是调用,并将异步操作的错误作为参数传递出去

  • 方法
    • then():分别指定resolved状态和rejected状态的回调函数
      • 第一参数:状态变为resolved时调用
      • 第二参数:状态变为rejected时调用(可选)
  • catch():指定发生错误时的回调函数
//catch方法
catch(onRejected){
  return this.then(null,onRejected)
}
  • Promise.all():将多个实例包装成一个新实例,返回全部实例状态变更后的结果数组(齐变更再返回)
    • 入参:具有Iterator接口的数据结构
    • 成功:只有全部实例状态变成fulfilled,最终状态才会变成fulfilled
    • 失败:其中一个实例状态变成rejected,最终状态就会变成rejected
//all方法
let arr = ['老子想月薪过万', '月薪过万想老子', '想老子月薪过万'].map(
    (value) => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(value);
            }, value * 1000);
        });
    }
);

console.log(arr);

let promises = Promise.all(arr)
.then((result) => {
    console.log(result);
}).catch((err) => {
    console.log(err);
});
# 上面的代码输出结果:
[ Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> } ]
['老子想月薪过万', '月薪过万想老子', '想老子月薪过万'] // 3s后输出的结果
  • Promise.race():将多个实例包装成一个新实例,返回全部实例状态优先变更后的结果(先变更先返回)
    • 入参:具有Iterator接口的数据结构
    • 成功失败:哪个实例率先改变状态就返回哪个实例的状态
//race方法
let arr = ['老子想月薪过万', '月薪过万想老子', '想老子月薪过万'].map(
    (value) => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(value);
            }, value * 1000);
        });
    }
);

console.log(arr);

let promises = Promise.race(arr)
.then((result) => {
    console.log(result);
}).catch((err) => {
    console.log(err);
});
# 上面的代码输出结果:
[ Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> } ]
老子想月薪过万 // 是最先改变状态的那个Promise实例resolve的值
  • Promise.resolve():将对象转为Promise对象(等价于new Promise(resolve => resolve()))
    • Promise实例:原封不动地返回入参
    • Thenable对象:将此对象转为Promise对象并返回(Thenable为包含then()的对象,执行then()相当于执行此对象的then())
    • 不具有then()的对象:将此对象转为Promise对象并返回,状态为resolved
    • 不带参数:返回Promise对象,状态为resolved
  • Promise.reject():将对象转为状态为rejected的Promise对象(等价于new Promise((resolve, reject) => reject()))
//resolve方法
Promise.resolve = function(val){
  return new Promise((resolve,reject)=>{
    resolve(val)
  })
}
//reject方法
Promise.reject = function(val){
  return new Promise((resolve,reject)=>{
    reject(val)
  })
}

    // reject的用法
    let p = new Promise((resolve, reject) => {
        //做一些异步操作
      setTimeout(function(){
            var num = Math.ceil(Math.random()*10); //生成1-10的随机数
            if(num<=5){
                resolve(num);
            }
            else{
                reject('数字太大了');
            }
      }, 2000);
    });
    p.then((data) => {
            console.log('resolved',data);
        },(err) => {
            console.log('rejected',err);
        }
    );