Javascript 如何使用Promise.all()重构异步/等待循环?

Javascript 如何使用Promise.all()重构异步/等待循环?,javascript,node.js,asynchronous,async-await,promise,Javascript,Node.js,Asynchronous,Async Await,Promise,我正试图了解如何在这段代码中使用Promise.all()。我读过一些文章,其中提到可以与Promise.all()并行运行异步操作以优化速度。以下是嵌套for循环中的当前代码(错误): 类型列表组={ listId:string groupid:Array } 常量列表和组:数组=[];//利息(id),, 可枚举:正确, }); } listsAndGroups.push(listObj); } 到目前为止,我是这样做的,我想我只是盲目地在这里跑步,而不知道自己在做什么: const li

我正试图了解如何在这段代码中使用Promise.all()。我读过一些文章,其中提到可以与Promise.all()并行运行异步操作以优化速度。以下是嵌套for循环中的当前代码(错误):

类型列表组={
listId:string
groupid:Array
}
常量列表和组:数组=[];//利息(id),,
可枚举:正确,
});
}
listsAndGroups.push(listObj);
}
到目前为止,我是这样做的,我想我只是盲目地在这里跑步,而不知道自己在做什么:

const listsAndGroups:Array=await getListsGroups();//{
const{lists}=wait-mailchimp.get('/lists');
const listGroups=lists.map((list)=>
getCategories(list.id)。然后((组)=>
groups.map((组:记录)=>{
返回{
listId:list.id,
…集团,
};
}),
),
);
返回承诺。全部(列表组);
};
const getCategories=async(listId:string)=>{
const{categories}=wait mailchimp.get(
`/列出/${listId}/interest categories`,
);
常量组=categories.map((category)=>
getInterests(listId,category.id),
);
返回承诺。所有(组);
};
const getInterests=async(listId:string,categoryId:string)=>{
const{interests}=wait mailchimp.get(
`/列出/${listId}/兴趣类别/${categoryId}/兴趣`,
);
返回{groupId:interest.map((interest)=>interest.id)};
};

您可以通过多种方式简化操作,以下是一种:

type ListGroup = {
    listId: string
    groupIds: Array<string>
}

const listsAndGroups: Array<ListGroup> = []; // <-- put everything here
const { lists } = await mailchimp.get('/lists');

const pandingLists = lists.map(list =>
    mailchimp.get(`/lists/${list.id}/interest-categories`)
        .then(data => [data, { listId: list.id }])
);

for (const [{ categories }, listObj] of await Promise.all(pandingLists)) {
    const batch = categories.map(({ id }) =>
        mailchimp.get(`/lists/${listObj.listId}/interest-categories/${id}/interests`).then(interests => {
            Object.defineProperty(listObj, 'groupIds', {
                value: interests.map(({ id }) => id),
                enumerable: true,
            });
        }));

    await Promise.all(batch).then(() => listsAndGroups.push(listObj));
}
类型列表组={
listId:string
groupid:Array
}
常量列表和组:数组=[];//
mailchimp.get(`/lists/${list.id}/interest categories`)
。然后(data=>[data,{listId:list.id}])
);
for(等待承诺的const[{categories},listObj]all(pandingLists)){
const batch=categories.map({id})=>
mailchimp.get(`/lists/${listObj.listId}/interest categories/${id}/interests`)。然后(interests=>{
Object.defineProperty(listObj,‘GroupId’{
值:interests.map(({id})=>id),
可枚举:正确,
});
}));
等待承诺。全部(批处理)。然后(()=>listsAndGroups.push(listObj));
}

这看起来不错!除了作为
此…
访问您的
常量之外,一切都应该正常-不是吗?@Bergi谢谢!这是可行的,但我只是想听听别人的意见。它变得更长了,我想知道是否还有一条更短的路。(另外,我在函数调用前面有
this
,因为这最初是在一个类中哈哈,我刚刚为这个问题重构了代码)我还使用了两个Promise.all()语句,并想知道一个Promise.all()是否可以获得列表数组(其中包含具有兴趣数组的组)。我仍然不知道该怎么做,因为一个异步函数依赖于另一个异步函数的结果。通过不为传递给
Promise.all
的数组使用临时变量,并让
getInterests
返回正确的对象(包含
listId
),可以稍微缩短它这样,您就不需要再次映射
getCategories
的结果。而且,不,您不能使用单个
承诺。所有
,就像您不能在原始代码中仅使用单个循环一样。但这会按顺序执行批处理,与OP的AttemTow不同!我没读到有问题的例子。。。