Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Promise.all解析获取请求_Javascript_Promise - Fatal编程技术网

Javascript 使用Promise.all解析获取请求

Javascript 使用Promise.all解析获取请求,javascript,promise,Javascript,Promise,我有一个由4个请求对象组成的数组,我想在这些对象上使用fetchapi并获取承诺。然后,我想解决这些承诺中的每一个,并找回价值观 下面是我如何构建请求对象的 let requestsArray = urlArray.map((url) => { let request = new Request(url, { headers: new Headers({ 'Content-Type': 'text/json'

我有一个由4个请求对象组成的数组,我想在这些对象上使用fetchapi并获取承诺。然后,我想解决这些承诺中的每一个,并找回价值观

下面是我如何构建请求对象的

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

        return request;
    });
下面是我如何尝试使用
Promise.all()

最后一个
console.log(值)
不会向控制台打印任何内容。我是否使用了
Promise.all()
错误


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

我看不出任何问题,对我来说,它返回的很好: 但是,这是对jsfiddles/echo/json URL的测试,而不是对原始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));

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

为什么要将其映射两次?让请求数组从fetch返回实际承诺

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

        return fetch(request).then(res => res.json());
    });
现在你有了一系列的承诺。这承诺,一切都接受了

Promise.all(requestsArray).then(allResults => {
  console.log(allResults)
})

这里有一个模拟的JSFIDLE:

没有函数对不起,我重命名了变量。现在更新了代码。您根本没有定义任何
catch
。。你确定没有错误吗?这回答了你的问题吗?我确实试过这样做,但我所有的请求,除了一个,似乎都挂在了网络标签上。唯一得到解决的是第一个请求。看起来您的代码/方法是正确的,但只是fetch请求没有得到解决。您是否尝试过在浏览器中手动打开这些URL?他们还东西吗?如果您单独捕获每个请求以查看停止了什么,会发生什么情况?是的,我尝试了
catch
错误处理。没有错误弹出。当我查看我的“网络”选项卡时,它只是说除了第一个请求外,其他请求都挂起了。@ZaidHumayun但行为是正确的。根据MDN,Promise.all“当给定iterable中的所有承诺都已解决,或者任何承诺被拒绝时”解决。在您的情况下,由于存在挂起的请求,因此它们没有解析/拒绝。你应该检查他们为什么花那么长时间(一定是网络问题,没有承诺)。是的,你是对的。在服务器上返回承诺的方式有问题。在那种情况下,我是否应该接受你的答案?我现在不知道如何解决这个问题。@ZaidHumayun因为它似乎解决了你的问题,如果你接受我的回答,我会很高兴的。但是,如果其他答案更有用/更详细等,您当然可以自由接受。
Promise.all(requestsArray).then(allResults => {
  console.log(allResults)
})