Skip to content

重写createModel

题目:如下,现在有一个creatModel函数,现在creatModel期望接受一个新字段p2,但是你的代码中已经到处调用了creatModel函数,你应该怎么编写一个creatModel2,然后全局替换掉creatModel?

js
// creatModel由第三方提供,不能修改,你也不知道细节
const creatModel = (params) => {

  // 其他细节逻辑,你不知道,略


  // 新加的参数
  params.p2 = params.p2 || '0'
  return async() => {
    // 其他细节逻辑,你不知道,略
    // return await fetch('https://xxxx')


    // mock的逻辑
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(params.p1 + params.p2)
      }, 1000)
    })
  }
}

// 很多地方都这样实现了
let fetchSome = creatModel({p1: 1})
fetchSome().then((res) => {
  console.log(res)
})

答:

js

const creatModel2 = (p1) => {
  // 返回一个函数,保持与creatModel相同的接口形态
  return async () => {
    // 在这个内部函数中获取p2并调用creatModel
    const getP2 = async () => {
      return Promise.resolve('2');
    };
    
    // 获取p2的值
    const p2 = await getP2();
    
    // 调用creatModel并执行它返回的函数
    const creatModelResult = creatModel({p1, p2});
    return creatModelResult();
  };
};

let fetchSome2 = creatModel2('1')

fetchSome2().then((res) => {
  console.log(res)
})