javascript的tricks集合

Q:对象的key如何由条件决定?
A:key使用[]

const a=2
const test={
    [a===1?'c':'d']:3,
    [b.x]:4
}//{d: 3, xxxx: 4}

Q:对象中要根据是否有值来决定相应的key是否存在?
A:使用解构赋值

const unknown=3
const obj = {
   a:'固定值',
  ...(unknown?{unknown}:{})
}//若unknown为false,obj为{a:'固定值'},若有值且为3则obj为{a:'固定值',unknown:3}

Q:Promise中的then嵌套太多怎么办?(假设需要网络获取c数据,但是c依赖b,b依赖a均需要通过网络请求)
A:使用async,await
Q:那要捕获异常要用try catch包裹await?
A:使用await to js库可以解决,同理可以解决promise.all捕获某一个promise返回的异常情况
await to js的核心代码如下

const isFunction =  (obj) =>{ return typeof (obj) === 'function'; };//判断是否是函数
const isPromiseLike =  (obj)=> {//判断是否是个包含then,catch函数的对象
    return !!obj && isFunction(obj.then) && isFunction(obj["catch"]);
};
function to(yourPromise) {//不管结果如何,返回[err,res]的形式
    if (isPromiseLike(yourPromise)) {
        return yourPromise.then((res)=> { return [null, res]; })["catch"]((err)=> { return [err || '未知错误', null]; });
    }
    else {
        return Promise.resolve([null, p]);
    }
}

那么有了to这个函数,就可以把层层嵌套改造为正常顺序来写
使用promise

function getData(){
  getDataA.then(res=>{
    getDataB.then(res1=>{
      getDataC.then(res2=>{
      //you code
      }).catch(err2=>{})
    }).catch(err1=>{})
  }).catch(err=>{})
}

使用awaittojs

async function getData(){
  const [err,res]=await to(getDataA)
  if(err){return}
  const [err1,res1]=await to(getDataB)
  if(err1){return }
  const [err1,res1]=await to(getDataC)
  if(err2){return}
  //your code
}

使用await to js 来处理 promise.all的捕获异常,假设getDataA,getDataB,getDataC为3个并行请求,需要捕获某一个的异常,但是整个请求还能继续发送

const data = [to(getDataA),to(getDataB),to(getDataC)]
const results = await Promise.all(data) //此时的results是数组[[err,res]...]
for(let i=0;i

你可能感兴趣的:(javascript的tricks集合)