下面一個簡單的例子,但願可以解決問題:
javascript
咱們將看到兩次執行相同的功能。首先使用Promise,而後第二次使用Async / Await
java
// Promise
function getJSON(){
// 建立一個Promise
return new Promise( function(resolve) {
axios.get('https://tutorialzine.com/misc/files/example.json')
.then( function(json) {
// 請求的數據用resolve返回結果
resolve(json);
});
});
}
// Async/Await
// async關鍵字將自動建立並返回 Promise
async function getJSONAsync(){
// wait關鍵字使咱們沒必要編寫.then()塊
let json = await axios.get('https://tutorialzine.com/misc/files/example.json');
// 請求的結果賦值給json變量並返回
return json;
}複製代碼
getJSONAsync()。then(function(result) {
//用result作一些事情。
});複製代碼
不會。使用Async / Await時,咱們仍在使用Promise。甚至有一些用例Async / Await沒有削減它,咱們不得不回到Promises尋求幫助。一個這樣的場景是當咱們須要進行多個獨立的異步調用並等待全部這些調用完成時。ios
async function getABC() {
let A = await getValueA(); // getValueA須要2秒才能完成
let B = await getValueB(); // etValueB須要4秒才能完成
let C = await getValueC(); // getValueC須要3秒才能完成
return A*B*C;
}複製代碼
async function getABC() {
// Promise.all() 容許同時發送全部請求。
let results = await Promise.all([ getValueA, getValueB, getValueC ]);
return results.reduce((total,value) => total * value);
}複製代碼
async function doSomethingAsync(){
try {
// 此異步調用可能會失敗。
let result = await someAsyncCall();
}
catch(error) {
// 若是失敗,將在這裏捕獲錯誤
}
}複製代碼
catch子句將處理由等待的異步調用或咱們可能在try塊內寫入的任何其餘失敗代碼引起的錯誤。
json
若是狀況須要,咱們還能夠在執行異步函數時捕獲錯誤。由於全部異步函數都返回Promise,因此在調用它們時咱們能夠簡單地包含一個.catch()事件處理程序。
axios
// 沒有try / catch塊的異步函數
async function doSomethingAsync(){
// 此異步調用可能會失敗
let result = await someAsyncCall();
return result;
}
// 在調用該函數捕獲錯誤。
doSomethingAsync().
.then(successHandler)
.catch(errorHandler);複製代碼
選擇你喜歡的錯誤處理方法並堅持下去是很重要的。同時使用try/catch和.catch()極可能會致使問題。瀏覽器
異步/等待瀏覽器支持bash
參考文獻:tutorialzine.com/2017/07/jav…服務器