javascript-使用嵌套的异步请求循环异步请求

前端之家收集整理的这篇文章主要介绍了javascript-使用嵌套的异步请求循环异步请求 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一种情况,我在调用具有分页的API.
我想做的是下面的内容,一次一页.

>调用API页面1
>对于响应中的每个项目,调用Promise以获取更多数据并存储在数组中
>将数组发送到API
>重复直到所有页面都完成

我目前拥有的是以下内容,但是我不确定使如何进行处理,这可能会使此操作过于复杂.

export const importData = async() {
    const pSize = 15;
    const response = await getItems(pSize,1);
    const noPage = Math.ceil(response.totalMerchandiseCount/pSize);

    for (let i = 1; i < noPage; i++) {
        const items = [];
        const data = await getItems(pSize,i);

        await async.each(data.merchandiseList,async(i,cb) => {
            const imageURL = await getImageURL(i.id,i.type);
            items.push({
                id: i.id,imageURL: imageURL,});
            cb();
        },async() => {
            return await api.mockable('sync',items);
        });
    }
}

export const getImageURL = async(id,type) => {
    let url = `https://example.com/${id}`;

    return axios.get(url)
        .then((response) => {
            const $= cheerio.load(response.data);

            // do stuff to get imageUrl

            return image;
        })
        .catch((e) => {
            console.log(e);
            return null;
        })
};

我目前遇到的问题是,它似乎要等到所有页面完成后才能调用api.mockable.此时项目也为空.

谁能建议一种使这种方法更整洁并帮助我使其工作的方法

最佳答案
如果这些都是串行的,那么您可以使用for-of循环:

export const importData = async() {
    const pSize = 15;
    const response = await getItems(pSize,1);
    const noPage = Math.ceil(response.totalMerchandiseCount/pSize);

    for (let i = 1; i < noPage; i++) { // Are you sure this shouldn't be <=?
        const items = [];
        const data = await getItems(pSize,i);

        for (const {id,type} of data.merchandiseList) {
            const imageURL = await getImageURL(id,type);
            items.push({id,imageURL});
        }
        await api.mockable('sync',items);
    }
}

我还在那里添加了一些销毁和速记属性.

猜你在找的JavaScript相关文章