Не могу вставить объект в другой объект, как я могу изменить свой код для работы с async / await? - PullRequest
0 голосов
/ 01 января 2019

У меня возникают проблемы при работе с API-интерфейсом "нумерация страниц", мне нужно объединить несколько объектов в один.Тем не менее, я не могу понять, как сделать это с обещаниями, и я не уверен, как работать с async / await, чтобы получить наилучшие результаты.

У меня есть класс selly, который работает с API Selly.

getAllProducts(page = 1) {
    return this.makeRequest('products', { page: page });
}
makeRequest(endpoint, params = {}) {
    return axios
        .get(`https://selly.gg/api/v2/${endpoint}`, {
            headers: {
                Authorization: `Basic ${this.genApiToken(this.apiKey, this.apiEmail)}`,
                'User-Agent': `username - localhost`,
            },
            params: params,
        })
        .catch((err) => {
            console.log(err);
        });
}

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

app.get('/api/products', (req, res) => {
    res.setHeader('Content-Type', 'application/json');
    selly.getAllProducts().then((request) => {
        const pages = request.headers['x-total-pages'];
        let products = request.data;
        if (pages > 1) {
            let i = 2;
            while (pages >= i) {
                selly.getAllProducts(i).then((nextPageRequest) => {
                    nextPageRequest.data.forEach((item) => {
                        products.push(item);
                    });
                });
                i++;
            }
        }
        res.send(JSON.stringify(products));
    });
});

Я не могу толкнуть nextPageRequest к products объекту.Очевидно, потому что res.send выполняется до того, как обещание selly.getAllProducts(i) будет выполнено.

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

Как мне заставить это работать?

1 Ответ

0 голосов
/ 01 января 2019

Вы можете сделать весь обработчик app.get async, затем await начальный запрос для определения количества страниц, затем использовать цикл for и await дополнительные вызовы selly.getAllProducts,отправка результата в массив products.Убедитесь, что try/catch, чтобы вы могли обрабатывать ошибки:

app.get('/api/products', async (req, res) => {
  res.setHeader('Content-Type', 'application/json');
  try {
    const request = await selly.getAllProducts();
    const pages = request.headers['x-total-pages'];
    const products = request.data;
    for (let i = 2; i <= pages; i++) {
      const { data } = await selly.getAllProducts(i);
      products.push(...data);
    }
    res.send(JSON.stringify(products));
  } catch(e) {
    // handle errors
  }
});
...