Promise中then的兩個參數與catch的介紹

JS中的Promise一共有三種狀態,分別爲pending(等待)、fulfilled(成功)、rejected(失敗),
Promise的狀態同一時間只能爲一種狀態。

1.Promise只能由Pending轉化爲fulfilled或者rejected,fulfilled與rejected不能相互轉化

var pro=new Promise((resolve,reject)=>{
    resolve();
    reject();
})
pro.then(()=>{
    console.log('resolve1');
},()=>{console.log('reject1')}).catch(()=>{
    console.log('catch1')
})
//輸出結果爲resolve1
var pro=new Promise((resolve,reject)=>{
    reject();
    resolve();
})
pro.then(()=>{
    console.log('resolve1');
},()=>{console.log('reject1')}).catch(()=>{
    console.log('catch1')
})
//輸出reject1

如果then添加了第二個參數,這時候就不會執行catch裏面的代碼

2.Promise中的then不添加第二個參數,這時候就會執行catch裏面的代碼

var pro=new Promise((resolve,reject)=>{
    // resolve();
    reject();
})
pro.then(()=>{
    console.log('resolve1');
}).catch(()=>{
    console.log('catch1')
})
//catch1

3.Promise的鏈式結構

Promise的鏈式結構原理是pro.then()或pro.catch()這個函數執行的返回值會返回一個promise對象,所以可以繼續調用then或者catch,來完成鏈式結構。

var pro=new Promise((resolve,reject)=>{
    resolve();
    reject();
})
pro.then(()=>{
    console.log('resolve1');
},()=>{console.log('reject1')}).catch(()=>{
    console.log('catch1')
}).then(()=>{
    console.log('resolve2');
},()=>{console.log('reject2')}).catch(()=>{
    console.log('catch2');
}).then(()=>{
    console.log('resolve3');
})
//輸出resolve1 resolve2 resolve3

但是有個重點是"promise執行完畢後返回的promise默認進入fulfilled狀態",所以執行完畢後默認執行鏈式結構中的resolve回調。

var pro=new Promise((resolve,reject)=>{
    // resolve();
    reject();
})
pro.then(()=>{
    console.log('resolve1');
},()=>{console.log('reject1')}).catch(()=>{
    console.log('catch1')
}).then(()=>{
    console.log('resolve2');
},()=>{console.log('reject2')}).catch(()=>{
    console.log('catch2');
}).then(()=>{
    console.log('resolve3');
})
//reject1 resolve2 resolve3

執行進入失敗狀態後,鏈式結構也會執行之後的resolve回調。

var pro=new Promise((resolve,reject)=>{
    resolve();
    reject();
})
pro.then(()=>{
    console.log('resolve1');
},()=>{console.log('reject1')).catch(()=>{
    console.log('catch1')
}).catch(()=>{
    console.log('catch2');
})
//輸出結果 resolve1

如果不存在then,則也不會執行catch裏面的代碼,因爲默認進入fullfilled狀態。需要記住的點是,進入什麼狀態就會什麼代碼。

4.then裏面的resolve報錯,catch是可以捕獲報錯信息,then的第二個參數不能捕獲

var pro=new Promise((resolve,reject)=>{
    resolve();
    reject();
})
pro.then(()=>{
    console.log('resolve1');
    var a = undefined;
    a.b();
    console.log('報錯了的代碼');
},(err)=>{console.log('reject1',err)}).catch((err)=>{
    console.log('catch1',err);
}).then(()=>{
    console.log('resolve2');
}).catch(()=>{
    console.log('catch2');
})

在這裏插入圖片描述
可以看到,resolve的回調執行報錯可以被catch捕獲到

5.Promise裏面執行的代碼可以被then的第二個參數捕獲到,並且不會進入到resolve,而是直接進入reject

var pro=new Promise((resolve,reject)=>{
    var a = undefined;
    a.b();
    resolve();
    reject();
})
pro.then(()=>{
    console.log('resolve1');
    console.log('報錯了的代碼');
},(err)=>{console.log('reject1',err)}).catch((err)=>{
    console.log('catch1',err);
}).then(()=>{
    console.log('resolve2');
}).catch(()=>{
    console.log('catch2');
})

在這裏插入圖片描述
沒有執行resolve代碼,直接進入了reject

var pro=new Promise((resolve,reject)=>{
    var a = undefined;
    a.b();
    resolve();
    console.log('報錯了的代碼reject之前');
    // reject();
    console.log('報錯了的代碼reject之後');
})
pro.then(()=>{
    console.log('resolve1');
    console.log('報錯了的代碼');
},(err)=>{console.log('reject1',err)}).catch((err)=>{
    console.log('catch1',err);
}).then(()=>{
    console.log('resolve2');
}).catch(()=>{
    console.log('catch2');
})

在這裏插入圖片描述
就算沒有reject回調,還是會進入reject回調
如果不存在then的第二個回調,則會進入catch

var pro=new Promise((resolve,reject)=>{
    var a = undefined;
    a.b();
    resolve();
    console.log('報錯了的代碼reject之前');
    reject();
    console.log('報錯了的代碼reject之後');
})
pro.then(()=>{
    console.log('resolve1');
    console.log('報錯了的代碼');
}).catch((err)=>{
    console.log('catch1',err);
}).then(()=>{
    console.log('resolve2');
}).catch(()=>{
    console.log('catch2');
})

在這裏插入圖片描述
如果catch的執行過程中報錯,則進入之後相鄰的catch

var pro=new Promise((resolve,reject)=>{
    var a = undefined;
    a.b();
    resolve();
    console.log('報錯了的代碼reject之前');
    reject();
    console.log('報錯了的代碼reject之後');
})
pro.then(()=>{
    console.log('resolve1');
    console.log('報錯了的代碼');
}).catch((err)=>{
    var a = undefined;
    a.b();
    console.log('catch1',err);
}).then(()=>{
    console.log('resolve2');
}).catch(()=>{
    console.log('catch2');
})

在這裏插入圖片描述
未完待續。。。。。。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章