// 使用promise的方式實現(xiàn)ajax
function ajax(url) {
return new Promise(function(resolve, reject) {
const xhr = new XMLHttpRequest();
xhr.open('Get'); // 定義請求方式
xhr.responseType = 'json'; // 定義返回值類型
xhr.onload = function() {
if(this.status === 200) {
resolve(this.response);
} else {
reject(new Error(this.statusText));
}
}
xhr.send();
})
}
ajax('/api/users.json').then(function(value) {
console.log(value);
}, function(error) {
console.log(error);
})
// 總結(jié)
// 1、promise對象的then方法會返回一個全新的promise對象
// 2、后面的then方法就是為上一個then方法返回的promise對象注冊回調(diào)
// 3、前面then方法中回調(diào)函數(shù)返回值作為下一個then方法中回調(diào)函數(shù)參數(shù)
// 4、如果回調(diào)函數(shù)返回一個新的promise,那后面then方法的回調(diào)會等待它的結(jié)束
// rejected為promise中執(zhí)行異?;蚴謩訏伋鲥e誤或執(zhí)行失敗提供回調(diào)處理
// 也可以用promise對象的catch方法來替代rejected回調(diào),效果一樣,如下
ajax('/api/users.json')
.then(function(value) {
console.log(value);
})
.catch(function(error) { // 等價于then(undefined, function(error) {console.log(error)})
console.log(error);
})
/**
* 注冊rejected回調(diào)和catch的區(qū)別是:
* rejected只能捕獲單獨的某一個Promise對象執(zhí)行時的異常
* 而ctach則能捕獲所有異常,異常會層層傳遞直至被捕獲
* 如下:
*/
ajax('/api/xxx.json')
.then(function(value) {
console.log(value);
return ajax('api/yyy.json');
}, function rejected(error) { // 他能捕獲調(diào)用ajax('/api/xxx.json')時的異常,但不能捕獲ajax('api/yyy.json')調(diào)用時的異常,而catch可以
console.log(error);
})
.catch(function(error) { // 更像是給整個promise鏈條注冊的失敗回調(diào),建議都是用這種情況,更方便,也更符合鏈式調(diào)用特性
console.log(error);
})
// 還有一種就是在全局注冊一個捕獲未處理異常的事件,unhandledRejection,但不建議這么做
// js運行環(huán)境寫法
window.addEventListener('unhandledrejection', event => {
const { reason, promise } = event;
// reason => promise發(fā)生錯誤的原因,一般是一個Error對象
// promise => 發(fā)生異常的promise對象
event.preventDefault();
}, false)
// node環(huán)境寫法
process.on('unhandledRejection', (reason, promise) => {
// reason => promise發(fā)生錯誤的原因,一般是一個Error對象
// promise => 發(fā)生異常的promise對象
});
promise實現(xiàn)ajax
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- ES6原生提供了Promise對象,代表了將來將要發(fā)生的事件,用來傳遞異步操作的消息。 兩個特點 Promise對...
- Promise 對象用于一個異步操作的最終結(jié)果(成功或失?。┑谋硎?。顧名思義,它代表一個承諾,一個對異步操作在未來...
- http://caibaojian.com/ajax-jsonp.html我的理解:關(guān)于注冊回調(diào)函數(shù)。一般要把它最...
- Promise比回調(diào)函數(shù)和事件到底好在哪里? 誰來告訴我。。。 好像是功能一樣,但是性能不一樣。
- 先創(chuàng)建了一個ajax的函數(shù) 函數(shù)參數(shù) 是es6的默認賦值操作,如果不輸入 就默認賦值。 第二步就是給函數(shù)ajax返...