如何 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 };
}