Promise對象
- Promise 出現的原因
- jQuery 體現回掉地獄,axios 是用 Promise 實現的;一個常用的技巧,用 setTimeout() 函數來模擬異步的請求,用於測試。
- 一個對象,接受兩個參數(函數),resolve 的作用就是該函數執行後會把 promise 變爲 fullfiled,如果 resolve 執行了,就繼續執行後面的 then 方法(回調函數)。
- Promise 是異步的,會立即執行,所以通常寫在函數裏作爲返回值,使用時直接調用函數即可。
let promise = new Promise((resolve,reject) => {
setTimeout(() => { //相當於ajax請求,在這裏寫請求的url
//var name = xxxxx ;
//resolve(name)
resolve('hello promise') //相當於接口返回的數據
},2000);
});
promise
.then(res => { //接受resolve傳過來的數據當作回掉函數的參數,做後續操作
console.log(res)
})
.catch(err => {
console.log(err)
});
- 一諾千金,不管結果如何,都會返回一個最終狀態(成功或失敗),更準確的說,resolve 是將 Promise 的狀態置爲 fullfiled,reject 是將 Promise 的狀態置爲rejected。
- Promise 的生命週期(狀態變化)。
- Promise 構造函數接受名爲執行器的函數,而且,傳入的函數會被立即執行,所以,用 Promise 的時候一般是包在一個函數中,在需要的時候去運行這個函數。
function myAsyncFunction(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onload = () => resolve(xhr.responseText);
xhr.onerror = () => reject(xhr.statusText);
xhr.send();
});
};
- then 中的函數就相當於回調函數;也就是說 Promise 把原來的回調寫法分離出來,在異步操作執行完後,用鏈式調用的方式執行回調函數。
- 一般來說,不要在 then 方法裏面定義 Reject 狀態的回調函數(即then的第二個參數),最好使用 catch 方法來捕獲錯誤。
- 最後一個 catch 可以捕獲中途的 reject 嗎????,Promise 對象的錯誤具有冒泡性質,會一直向後傳遞,直到被捕獲爲止。也就是說,錯誤總是會被下一個catch語句捕獲。
- https://www.cnblogs.com/ainyi/p/8665272.html
- https://www.cnblogs.com/suihang/p/9595548.html
10.https://www.cnblogs.com/qq9694526/p/5714124.html - https://zhuanlan.zhihu.com/p/52714698
- 如何自己實現一個 Promise ?
- Promise 的應用:
加載圖片
。。
。。。
Async函數
Promise 中通過 then 來串聯雖然保證了至少代碼順序上和真正的邏輯順序一致,但和同步代碼的差別仍然很大。async/await 則直接將其變成了同步的寫法,心智負擔大大降低。
- async 函數就是返回 Promise 的函數
- await 後面接 Promise 對象
參考:
https://www.cnblogs.com/lvdabao/p/es6-promise-1.html
https://www.zcfy.cc/article/javascript-promises-for-dummies-scotch-1961.html
https://zhuanlan.zhihu.com/p/23249103 aysnc
https://www.cnblogs.com/SamWeb/p/8417940.html
https://www.jianshu.com/p/2c1bdd3cf3b9 手寫promise