我有一个包含4个请求对象的数组,我想使用Fetch API并获得承诺。然后我想要解决这些承诺中的每一个并获得价值。
以下是我构建请求对象的方法。
let requestsArray = urlArray.map((url) => {
let request = new Request(url, {
headers: new Headers({
'Content-Type': 'text/json'
}),
method: 'GET'
});
return request;
});
以下是我尝试使用Promise.all()
Promise.all(requestsArray.map((request) => {
return fetch(request).then((response) => {
return response.json();
}).then((data) => {
return data;
});
})).then((values) => {
console.log(values);
});
最后一个console.log(values)
不会向控制台打印任何内容。我使用Promise.all()
错了吗?
我知道第一个请求通过,当我单独运行每个请求时,它工作正常。唯一的问题是当我尝试同时运行它们时。
答案 0 :(得分:3)
我无法看到任何问题,对我而言,它返回正常:https://jsfiddle.net/np5bx03j/
但是,这是使用jsfiddles / echo / json URL而不是原始URL的测试。因此,我会假设您的情况发生了一些错误。
我建议添加template<typename T>
struct Node {
Node(): item(), next(nullptr) {}
Node(T x): item(x), next(nullptr) {}
T item;
Node* next;
};
template <typename T>
struct List {
List() : head(nullptr), tail(nullptr) {}
~List() { clear(); }
Node<T>* head, tail;
void insert(T x) {
Node<T>* newNode = new Node<T>(x);
if (head == nullptr) head = tail = newNode;
else {
tail->next = newNode;
tail = tail->next;
}
}
void clear() {
while (head) {
Node<T> *p = head; head = head->next;
delete p;
}
tail = nullptr;
}
// Using the default copy ctor would corrupt the memory management.
// Deleting it lets the compiler check for accidental usage.
List(const List&) = delete;
// Delete assignment operator as well.
List& operator=(const List&) = delete;
};
来记录错误:
catch
编辑:只是为了完整起见:我根据API(MDN)或其他任何内容都看不到任何问题。
答案 1 :(得分:3)
为什么要映射两次?让请求数组从fetch中返回实际的promise。
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接受。
Promise.all(requestsArray).then(allResults => {
console.log(allResults)
})
这是一个嘲笑这个问题的方法:https://jsfiddle.net/uu58t1jj/