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