丐版的Promise

简易版的Promise

    const PENDING = 'PENDING'
    const REJECT = 'REJECT'
    const FULFIllED = 'FULFIllED'
    class Promise {
      constructor(executor) {
        this.state = PENDING
        this.value = null
        this.reason = null
        const resolve = (value) => {
          if (this.state === PENDING) {
            this.value = value
            this.state = FULFIllED
          }
        }
        const reject = (reason) => {
          if (this.state === PENDING) {
            this.reason = reason
            this.state = REJECT
          }
        }
        executor(resolve, reject)
      }
      then(onResolve, onREject) {
        if (this.state === FULFIllED) {
          onResolve(this.value)
        }
        if (this.state === REJECT) {
          onREject(this.reason)
        }
      }
    }

Promise.all

   let fs = require('fs')
    const readFile = (path) => {
      return new Promise((resolve, reject) => {
        fs.readFile(path, 'utf-8', (err, data) => {
          if (err) reject(err)
          resolve(data)
        })
      })
    }
    Promise.MyAll = (ps) => {
      return new Promise((resolve, reject) => {
        let resArr = []
        let times = 0
        const getRes = (i, val) => {
          resArr[i] = val
          times++
          if (times === ps.length) {
            resolve(resArr)
          }
        }
        for (let i = 0; i < ps.length; i++) {
          const val = ps[i]
          if (typeof val.then === 'function') {
            val.then((val) => getRes(i, val), reject)
          } else {
            getRes(i, val)
          }
        }
      })
    }
    Promise.MyAll([false, readFile('./a.txt'), readFile('./b.txt'), 1, 2, 0]).then(
      (res) => {
        console.log(res)
        //[ false, 'aa', 'bb', 1, 2, 0 ]
      }
    )
// promse.race , 只看第一个结果,不论是成功还是失败
Promise.MyRace = (arr) => {
  return new Promise((resolve, reject) => {
    arr.forEach((item, index) => {
      Promise.resolve(item).then(
        (value) => {
          resolve(value)
        },
        (reason) => {
          reject(reason)
        }
      )
    })
  })
}

发布订阅

    const fs = require('fs')
    const after = (times, cb) => {
      let obj = {}
      return (key, value) => {
        --times
        obj[key] = value
        if (times === 0) {
          cb(obj)
        }
      }
    }
    const out = after(2, (obj) => {
      console.log('obj', obj)
    })
    fs.readFile('./a.txt', 'utf-8', (err, data) => {
      out('name', data)
    })
    fs.readFile('./b.txt', 'utf-8', (err, data) => {
      out('age', data)
    })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值