сделать несколько запросов API и вернуть отфильтрованный ответ без дубликатов - PullRequest
0 голосов
/ 13 февраля 2020

Сторонний API может обрабатывать только одну строку запроса одновременно. Поэтому я пытаюсь получить параметр запроса, разделить его на массив и затем выполнить асинхронные вызовы c.

Проблема в том, что мне нужно отфильтровать окончательный ответ, чтобы удалить все дубликаты, и получить окончательный ответ без любые дубликаты.

Я пытался собрать sh ответы в массив, а затем отправить их как ответ, но я немного растерялся.

    const tags = req.query.tags;
    let urls = [];
    tags.split(",").forEach(tag => {
        urls.push(`https://apicall.com/posts?tag=${tag}`);
    });
    let posts = [];
    const fetchdata = async () => {
        urls.forEach(url => {
            const response = await axios.get(url);
            posts.push(response.data.posts);
        });
    };
    ????
    // Promise.all(fetchdata()).then(data => {
           //remove duplicates
           //res.json(posts)
       });

Следующие коды возвращает наборы массивов, что не идеально. Мне нужно вернуть 1 комбинированный ответ при удалении дубликатов:

const fetchdata = async tags => {
        const response = await axios.get(
            `https://apicall.com/posts?tag=${tag}`
        );
        return response.data.posts
    };

    Promise.all(
        tags.split(",").length > 1
            ? tags.split(",").map(fetchdata)
            : [fetchdata(tags)]
    ).then(data => res.json(data))

1 Ответ

0 голосов
/ 13 февраля 2020

Вот метод использования Promise.all() для сбора всех результатов, сглаживание массива массивов до одного массива:

const tags = req.query.tags;
let urls = [];
tags.split(",").forEach(tag => {
    urls.push(`https://apicall.com/posts?tag=${tag}`);
});
Promise.all(urls.map(url => {
    return axios.get(url).then(response => response.data.posts);
})).then(results => {
    let singleArray = results.flat();

    // de-dup this array here (left to the reader to finish)

    res.json(finalResult);
}).catch(err => {
    console.log(err);
});

Общая идея заключается в том, что вы используете urls.map(), чтобы вернуть массив обещания.

Вы используете Promise.all() для этого массива или обещания знать, когда они все выполнены, и получить окончательный массив результатов.

Затем используйте .flat(), чтобы превратить массив массивы в один массив.

Затем они должны быть дедуплицированы. Я предполагаю, что это массив объектов, но я не знаю, какое свойство в этих объектах является ключом для дедупликации. Вам нужно будет показать нам, что есть у каждого пост-объекта и что определяет дублирование.


Вот пример того, как вы можете использовать объект Map для дедупликации массива объектов. Предположим, что у каждого объекта есть свойство .id, и это свойство вы хотите использовать для дедупликации, чтобы в конечном массиве результатов не было двух объектов с одинаковым id.

let tracker = new Map();
for (const post of singleArray) {
    tracker.set(post.id, post);
}
// get an array of posts from the Map object
let uniquePosts = Array.from(tracker.values());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...