如何 return 从 API Javascript 解析自定义数据的承诺
How to return a promise that resolves customized data from API Javascript
所以我正在使用 National Weather Service 的 API 创建一个天气应用程序。但是取的数据很复杂,需要取两个不同的API。所以我想写一个自定义的异步函数,returns 一个承诺,它解析为一个只包含我需要的必要数据的对象。
我想到了这样的东西:
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);
})
}
这段代码对我有用。但问题是,如果 APIs 拒绝了怎么办?如何处理错误以便在返回的承诺中显示错误消息?我可能想要这样的东西:
return new Promise((resolve,reject)=>{
if(...) reject(errrorMessage);
resolve(data);
})
就做return data
。您已经在 async
函数中,该函数的 return 值将是 async
函数已经 returns:[=22 的承诺的解析值=]
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()
完全是多余和不必要的(称为 anti-pattern)。您可以将其删除并改为 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 };
}
所以我正在使用 National Weather Service 的 API 创建一个天气应用程序。但是取的数据很复杂,需要取两个不同的API。所以我想写一个自定义的异步函数,returns 一个承诺,它解析为一个只包含我需要的必要数据的对象。
我想到了这样的东西:
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);
})
}
这段代码对我有用。但问题是,如果 APIs 拒绝了怎么办?如何处理错误以便在返回的承诺中显示错误消息?我可能想要这样的东西:
return new Promise((resolve,reject)=>{
if(...) reject(errrorMessage);
resolve(data);
})
就做return data
。您已经在 async
函数中,该函数的 return 值将是 async
函数已经 returns:[=22 的承诺的解析值=]
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()
完全是多余和不必要的(称为 anti-pattern)。您可以将其删除并改为 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 };
}