输出顺序

console.log(2);
let doit;
const prom = new Promise((resolve, reject) => {
    console.log(3)
    doit = resolve;
    console.log(6)
});
prom.then(n => console.log(4));
 
async function s1() {
    console.log(7)
    await s2();
    console.log(1)
    doit();
    setTimeout(() => {
      console.log('a')
    }, 0)
    console.log(8);
}
async function s2() {
    console.log(9)
}
 
s1();
console.log(5);
prom.then(n => console.log(10));
 
// results: 2 3 6 7 9 5 1 8 4 10 a
Promise.resolve()
  .then(() => {
    console.log(0)
    return Promise.resolve(4)
  })
  .then(res => {
    console.log(res)
  })
 
Promise.resolve()
  .then(() => {
    console.log(1)
  })
  .then(() => {
    console.log(2)
  })
  .then(() => {
    console.log(3)
  })
  .then(() => {
    console.log(5)
  })
  .then(() => {
    console.log(6)
  })
 
// 0 1 2 3 4 5 6
 

Promise.all

function promiseAll(pList) {
  return new Promise((resolve, reject) => {
    const results = []
    let count = 0
 
    for (let i = 0; i < pList.length; i++) {
      pList[i]
        .then(data => {
          results[i] = data
          count++
 
          if (count === pList.length) {
            resolve(results)
          }
        })
        .catch(err => {
          reject(err)
        })
    }
  })
}

Promise.race

function promiseRace(pList) {
  return new Promise((resolve, reject) => {
    const promiseLength = pList.length
    if (promiseLength === 0) {
      return resolve()
    } else {
      for (let i = 0; i < promiseLength; i++) {
        Promise.resolve(pList[i]).then(
          value => resolve(value),
          reason => reject(reason)
        )
      }
    }
  })
}

catch、finally、resolve、reject

class Promise {
  catch(onRejected) {
    return this.then(undefined, onRejected)
  }
 
  finally(onFinally) {
    return this.then(
      data => {
        onFinally()
        return data
      },
      err => {
        onFinally()
        throw err
      }
    )
  }
 
  static resolve(value) {
    if (value instanceof Promise) return value
 
    return new Promise(resolve => {
      resolve(value)
    })
  }
 
  static reject(reason) {
    return new Promise((resolve, reject) => {
      reject(reason)
    })
  }
}