js相关知识点

90 阅读1分钟

1. promise

1.1 实现红绿灯

function red() {
  console.log('red')
}
function green() {
  console.log('green')
}
function yellow() {
  console.log('yellow')
}

const light = (timer, cb) => {
  return new Promise(resolve => {
    setTimeout(() => {
      cb()
      resolve()
    }, timer)
  })
}

const step = function () {
  Promise.resolve()
    .then(() => {
      return light(3000, red)
    })
    .then(() => {
      return light(2000, yellow)
    })
    .then(() => {
      return light(1000, green)
    })
    .then(() => {
      return step()
    })
}

step()
  • 使用 await 实现
function getLight(fn, timer) {
  return new Promise(resolve => {
    setTimeout(() => {
      fn()
      resolve()
    }, timer * 1000)
  })
}
function red() {
  console.log('red')
}
function green() {
  console.log('green')
}
function yello() {
  console.log('yello')
}

async function run() {
  await getLight(red, 30)
  await getLight(green, 20)
  await getLight(yello, 10)
  run()
}

run()

1.2 实现每秒自动加一

其实,这道题就是上面那道题的变形。

let count = 0

const addOne = () => {
  count = count + 1
  console.log(count)
}
const addOneByOneSecond = (timer, cb) => {
  return new Promise(resolve => {
    setTimeout(() => {
      cb()
      resolve()
    }, timer)
  })
}

const finalFunc = () => {
  Promise.resolve()
    .then(() => {
      return addOneByOneSecond(1000, addOne)
    })
    .then(() => {
      return finalFunc()
    })
}

finalFunc()

1.3 Promise.all

function myPromiseAll(promises) {
  return new Promise((resolve, reject) => {
    const res = []
    let finished = 0

    promises.forEach((p, i) => {
      Promise.resolve(p).then(v => {
        res[i] = v
        finished++
        if (finished === promises.length) resolve(res)
      }, reject)
    })
  })
}

1.4 Promise.allsettled

function myPromiseAllSettled(promises) {
  return new Promise(resolve => {
    const results = []
    let count = 0
    const arr = Array.from(promises)

    if (arr.length === 0) {
      resolve([])
    }

    arr.forEach((p, index) => {
      Promise.resolve(p)
        .then(value => {
          results[index] = {
            status: "fulfilled",
            value
          }
        })
        .catch(reason => {
          results[index] = {
            status: "rejected",
            reason
          }
        })
        .finally(() => {
          count++

          if (count === arr.length) {
            resolve(results)
          }
        })
    })
  })
}