使用 Promise.all 解决 fetch 请求

ran*_*101 2 javascript promise

我有一个包含 4 个请求对象的数组,我想在这些对象上使用 Fetch API 并取回承诺。然后我想解决这些承诺中的每一个并取回价值。

这是我构建请求对象的方式。

let requestsArray = urlArray.map((url) => {
        let request = new Request(url, {
            headers: new Headers({
                'Content-Type': 'text/json'
            }), 
            method: 'GET'
        });

        return request;
    });
Run Code Online (Sandbox Code Playgroud)

这是我尝试使用的方式 Promise.all()

Promise.all(requestsArray.map((request) => {
        return fetch(request).then((response) => {
            return response.json();
        }).then((data) => {
            return data;
        });
    })).then((values) => {
        console.log(values);
    });
Run Code Online (Sandbox Code Playgroud)

最后一个console.log(values)不会向控制台打印任何内容。我用Promise.all()错了吗?

我知道第一个请求通过了,当我单独运行每个请求时,它工作正常。唯一的问题是当我尝试同时运行它们时。

SVS*_*idt 5

我看不出任何问题,对我来说它返回得很好:https : //jsfiddle.net/np5bx03j/ 但是,这是一个使用 jsfiddles /echo/json URL的测试,而不是你原来的。因此,我假设您的情况发生了一些错误。我建议添加一个catch来记录错误:

Promise.all(requestsArray.map((request) => {
    return fetch(request).then((response) => {
        return response.json();
    }).then((data) => {
        return data;
    });
})).then((values) => {
    console.log('values', values);
}).catch(console.error.bind(console));
Run Code Online (Sandbox Code Playgroud)

编辑:只是为了完整起见:根据 API ( MDN ) 或其他任何内容,我都看不到任何问题。

  • @ZaidHumayun 但是行为是正确的。根据 MDN, Promise.all 解决“当给定迭代中的所有承诺都已解决,或者任何承诺拒绝时”。在您的情况下,由于有待处理的请求,它们没有解决/拒绝。你应该检查他们为什么要花这么长时间(一定是网络问题,与 Promises 无关)。 (2认同)