N-ZOO / everycode

前端每日一练
163 stars 18 forks source link

[js]使一个返回Promise的函数同时支持`Error-first`回调形式与`Promise`调用方式。 #25

Open Jiasm opened 6 years ago

Jiasm commented 6 years ago

使函数同时支持两种调用方法:

function pro(a, b) {
  return new Promise((resolve, reject) => {
    resolve(a + b)
  })
}

function wrap(func) {
  // code here
}

let func = wrap(pro)

func(1, 2, (err, result) => {
  if (err) {
    console.error(err)
  } else {
    console.log(result)
  }
})

func(1, 2).then(console.log, console.error)
VaJoy commented 6 years ago

欢迎出题,捧场下了

    function pro(a, b) {
      return new Promise((resolve, reject) => {
            reject(a + b)
      })
    }

    function wrap(func) {
      let argNum = func.length;
      return function result(...args){
        let pm = func.apply(null, args);
        let efCallback = args[argNum];
        if(typeof efCallback === 'function'){
          pm.then(data=>{
            efCallback(null, data)
          }).catch(err=>{
            efCallback(err)
          })
        } else {
          return pm
        }
      }
    }

    let func = wrap(pro)

    func(1, 2, (err, result) => {
      if (err) {
        console.error(err)
      } else {
        console.log(result)
    }
    })

    func(1, 2).then(console.log, console.error)
Jiasm commented 6 years ago

因为示例中并没有用到reject,所以函数签名仅写了一个,我来修改一下。

VaJoy commented 6 years ago

@Jiasm 嗯嗯,刚刚看走眼了以为只有一个参数会有问题囧。 我帮你去群里宣传下,多喊些人来