无法将对象推入另一个对象,如何更改代码以与异步/等待一起使用?

时间:2019-01-01 02:09:22

标签: javascript node.js ajax promise axios

我在尝试使用api“分页”时遇到问题,我需要将多个对象合并为一个。但是,我似乎无法弄清楚如何用Promise做到这一点,而且我不确定如何与async / await一起使用以获得最佳结果。

我有一个称为Selly的类,可与Selly API一起使用。

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)完成之前就已经运行。

我知道,对此的最佳优化是使用异步和等待,但是我只是无法了解它的基本概念,或者,至少我将如何重构代码以使用异步和等待。

我该如何工作?

1 个答案:

答案 0 :(得分:0)

您可以使整个soalan处理程序foreach ($soalan_id as $question) { $Jawapan = New Jawapan(); $Jawapan->status_pengesahan = "belum_disahkan"; $Jawapan->soalan_id = $question->soalan_id; $Jawapan->sesi_id = $request->sesi_id; $Jawapan->agensi_id = $request->agensi_id; $Jawapan->save(); } ,然后向part.get_payload(decode=True).decode('utf-8') 发出初始请求以找出有多少页,然后使用app.get循环和{{ 1}}个额外的async调用,将结果推入await数组。请确保for以便处理错误:

await