首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行promise.all of promise.alls

运行promise.all of promise.alls
EN

Stack Overflow用户
提问于 2018-05-16 16:13:06
回答 1查看 1.6K关注 0票数 2

我已经向一台服务器提出了400多个请求--并且把每个内部的承诺都做好了。

当在一个promise.all中运行所有400个请求时,系统就会崩溃。

我将我的请求分成50个承诺(并将它们添加到promise.all中),并将它们添加到另一个promise.all中。

我怎样才能成批地执行承诺,然后等待这些承诺完成,然后再开始下一个承诺呢?

代码语言:javascript
复制
// attach the other accounts a user has to the wrapper object
// **this is 400+ requests object, that has the requests in it**
// results are promises
const influencerAccounts = wrapper.map(p => addInfluencerAccounts(p));

// split the requests into chunks to stop the server falling over
const chunkedPromises = _.chunk(influencerAccounts, 50);

// promise.all on each chunk of promises/requests
// ????


// ...

return

我已经尝试过遍历每个承诺数组(这是一个承诺数组)和Promise.all(ing) --但这不会等到上一批完成后再发送下一批。

谢谢,

奥利

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-16 16:28:24

你犯了很多人一开始就犯的错误:Promise.all不运行任何东西。它只是在等待已经在运行的东西。当您将influencerAccounts数组分解成块时,您可能已经重载了服务器,因为您仍然在同时发送400+请求。

相反,将payout数组块化,然后以块的形式处理它,如下所示:

代码语言:javascript
复制
const results = [];
const promise =
    _.chunk(payout, 50).reduce(
        (p, chunk) =>
            p.then(chunkResults => {
                results.push(...chunkResults);
                return Promise.all(chunk.map(startRequest)); 
            })
        ,
        Promise.resolve([])
    )
    .then(() => results);

我使用了上面的startRequest,而不是createInfluencerWrapperaddInfluencerAccounts,因为我不清楚您是否引入了一个或另一个,以使您的分块工作。但如果不是,startRequest就是addInfluencerAccounts(createInfluencerWrapper(entry))

它启动50个请求块,使用Promise.all等待所有请求完成,然后启动下一个50个请求块。“做完后再做”部分来自承诺reduce成语,其简单形式如下所示:

代码语言:javascript
复制
someArray.reduce((p, entry) => p.then(() => doSomethingWith(entry)), Promise.resolve());

它以一个已解决的承诺开始,并将一个then处理程序挂在上面以完成下一件事情,而后者将一个then处理程序挂在上面以完成下一件事情,等等。

如果您不喜欢在results上关闭,我们可以沿着reduce链传递它;下面是上面的第一个版本:

代码语言:javascript
复制
const promise =
    _.chunk(payout, 50).reduce(
        ({p, results}, chunk) => ({
            p: p.then(chunkResults => {
                results.push(...chunkResults);
                return Promise.all(chunk.map(startRequest)); 
            }),
            results
        }),
        {p: Promise.resolve([]), results: []}
    )
    .then(({results}) => results);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50375598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档