所以我使用National Weather Service的 API來創建一個天氣應用程式。但是獲取的資料很復雜,需要獲取兩個不同的API。所以我想撰寫一個自定義的異步函式,它回傳一個 Promise,它決議為一個只包含我需要的必要資料的物件。
我想出了這樣的事情:
async function fetchWeatherAPI(){
//data that I need
let data = {};
try {
const res1 = await fetch(url1);
const result1 = await res1.json();
data = {...data , result1.usefulData};
} catch(error){}
try {
const res2 = await fetch(url2);
const result2 = await res2.json();
data = {...data, result2.usefulData};
} catch(error){}
return new Promise((resolve,reject)=>{
resolve(data);
})
}
這段代碼對我有用。但問題是,如果 API 拒絕怎么辦?如何處理錯誤,以便在回傳的 promise 中顯示錯誤訊息?我可能想要這樣的東西:
return new Promise((resolve,reject)=>{
if(...) reject(errrorMessage);
resolve(data);
})
uj5u.com熱心網友回復:
做吧return data。您已經在一個async函式中,該函式的回傳值將是該async函式已經回傳的 promise 的決議值:
async function fetchWeatherAPI(){
//data that I need
let data = {};
const res1 = await fetch(url1);
const result1 = await res1.json();
data = {...data , result1.usefulData};
const res2 = await fetch(url2);
const result2 = await res2.json();
data = {...data, result2.usefulData};
return data;
}
此外,您的catch塊正在默默地吃錯誤并試圖繼續,就好像沒有出錯一樣。您可能只是希望將錯誤傳播回呼叫者,因此如果您只是洗掉try/catch塊,就會發生這種情況。
而且,return new Promise()你所擁有的完全是多余的和不必要的(稱為反模式)。你可以洗掉它,return data而不是。
注意:由于您顯示的代碼在您的第一次和第二次呼叫之間沒有顯示任何依賴關系fetch(),因此您可以并行運行它們并且可能更快地完成它們。
async function fetchWeatherAPI(){
//data that I need
let data = {};
const [result1, result2] = await Promise.all([
fetch(url1).then(r => r.json()),
fetch(url2).then(r => r.json())
]);
return {...data, result1.usefulData, result2.usefulData};
}
fetch()或者,在進行大量呼叫時,我經常在代碼中使用輔助函式:
function fetchJson(...args) {
return fetch(...args).then(r => r.json());
}
async function fetchWeatherAPI() {
//data that I need
let data = {};
const [result1, result2] = await Promise.all([
fetchJson(url1),
fetchJson(url2)
]);
return { ...data, result1.usefulData, result2.usefulData };
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/456687.html
標籤:javascript api 异步 承诺
