使用Promise.all解析获取请求

时间:2017-07-29 13:10:54

标签: 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;
    });

以下是我尝试使用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()错了吗?

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

2 个答案:

答案 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/