Skip to content

Promise对象用于表示一个异步操作的最终完成(或失败)及其结果值

Promise的几种状态:

  • 待定(pending) 初始状态,既没有被兑现,也没有被拒绝。
  • 已兑现(fulfilled) 操作成功完成
  • 已拒绝(rejected) 操作失败
  • **已敲定(settled)**已经被兑现(fulfilled)或被拒绝(rejected)

Promise的链式调用,我们可以用 promise.then()promise.catch() 和 promise.finally()这些方法将进一步的操作与一个变为已敲定状态的 promise 关联起来。这些方法还会返回一个新生成的 promise 对象。

手写Promise

class Promise2{
  success = []
  fail = []
  constructor(fn){
    const resolve = (data)=>{
      setTimeout(()=>{
        for(let i=0;i<this.success.length;i++){
          this.success[i](data)
        }
      })
    }
    const reject = (reason)=>{
      setTimeout(()=>{
        for(let i=0;i<this.fail.length;i++){
          this.fail[i](reason)
        }
      })
    }
    fn(resolve,reject)
  }
  then(resolve,reject){
    this.success.push(resolve)
    this.fail.push(reject)
    return this
  }
}

p1 = new Promise2((resovle,reject)=>{console.log('hi');
                                     Math.random()>0.5 ? resovle() : reject()
                                    }
                 )
p1.then(()=>{console.log('success1')},()=>{console.log('fail1')})
  .then(()=>{console.log('success2')},()=>{console.log('fail2')})
  .then(()=>{console.log('success3')},()=>{console.log('fail3')})

Promise

fn(){
	return new Promise((resolve,reject)=>{
    		 成功时调用 resolve(数据)
         失败时调用 reject(错误)
     })
 }
fn().then(success1,fail1).then(success2,fail2)

Promise.then()

使用.then(success,fail)传入成功和失败函数

const promise1 = new Promise((resolve, reject) => {
  resolve('Success!');
});

promise1.then((value) => {
  console.log(value);
  // expected output: "Success!"
});

Promise.all

Promise.all()方法接受返回一个iterable类型(Array,Map,Set),并且只返回一个数组的Promise实例。reslove等所有promise的resolve回调都结束,reject回调时有错立即抛出错误。

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
// expected output: Array [3, 42, "foo"]
 Promise.all([promise1, promise2]).then(success1, fail1)

Promise.race

Promise.race(iterable)方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。即迭代器内那个先结束就先返回那个的promise。(类似于跑步谁快,谁拿奖)

const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then((value) => {
  console.log(value);
  // Both resolve, but promise2 is faster
});
// expected output: "two"
------------------------------------------------
 Promise.race([promise1, promise2]).then(success1, fail1)
//promise1和promise2只要有一个成功就会调用success1;
//promise1和promise2只要有一个失败就会调用fail1;
//总之,谁第一个成功或失败,就认为是race的成功或失败。