Q:對象的key如何由條件決定?
A:key使用[]
const a=2
const test={
[a===1?'c':'d']:3,
[b.x]:4
}//{d: 3, xxxx: 4}
Q:對象中要根據(jù)是否有值來決定相應(yīng)的key是否存在?
A:使用解構(gòu)賦值
const unknown=3
const obj = {
a:'固定值',
...(unknown?{unknown}:{})
}//若unknown為false,obj為{a:'固定值'},若有值且為3則obj為{a:'固定值',unknown:3}
Q:Promise中的then嵌套太多怎么辦?(假設(shè)需要網(wǎng)絡(luò)獲取c數(shù)據(jù),但是c依賴b,b依賴a均需要通過網(wǎng)絡(luò)請求)
A:使用async,await
Q:那要捕獲異常要用try catch包裹await?
A:使用await to js庫可以解決,同理可以解決promise.all捕獲某一個promise返回的異常情況
await to js的核心代碼如下
const isFunction = (obj) =>{ return typeof (obj) === 'function'; };//判斷是否是函數(shù)
const isPromiseLike = (obj)=> {//判斷是否是個包含then,catch函數(shù)的對象
return !!obj && isFunction(obj.then) && isFunction(obj["catch"]);
};
function to(yourPromise) {//不管結(jié)果如何,返回[err,res]的形式
if (isPromiseLike(yourPromise)) {
return yourPromise.then((res)=> { return [null, res]; })["catch"]((err)=> { return [err || '未知錯誤', null]; });
}
else {
return Promise.resolve([null, p]);
}
}
那么有了to
這個函數(shù),就可以把層層嵌套改造為正常順序來寫
使用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的捕獲異常,假設(shè)getDataA,getDataB,getDataC為3個并行請求,需要捕獲某一個的異常,但是整個請求還能繼續(xù)發(fā)送
const data = [to(getDataA),to(getDataB),to(getDataC)]
const results = await Promise.all(data) //此時的results是數(shù)組[[err,res]...]
for(let i=0;i<data.length;i++){
const [err,res] = results[i]
if(err){//具體處理}
}