我已经向一台服务器提出了400多个请求--并且把每个内部的承诺都做好了。
当在一个promise.all中运行所有400个请求时,系统就会崩溃。
我将我的请求分成50个承诺(并将它们添加到promise.all中),并将它们添加到另一个promise.all中。
我怎样才能成批地执行承诺,然后等待这些承诺完成,然后再开始下一个承诺呢?
// 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) --但这不会等到上一批完成后再发送下一批。
谢谢,
奥利
发布于 2018-05-16 16:28:24
你犯了很多人一开始就犯的错误:Promise.all不运行任何东西。它只是在等待已经在运行的东西。当您将influencerAccounts数组分解成块时,您可能已经重载了服务器,因为您仍然在同时发送400+请求。
相反,将payout数组块化,然后以块的形式处理它,如下所示:
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,而不是createInfluencerWrapper和addInfluencerAccounts,因为我不清楚您是否引入了一个或另一个,以使您的分块工作。但如果不是,startRequest就是addInfluencerAccounts(createInfluencerWrapper(entry))。
它启动50个请求块,使用Promise.all等待所有请求完成,然后启动下一个50个请求块。“做完后再做”部分来自承诺reduce成语,其简单形式如下所示:
someArray.reduce((p, entry) => p.then(() => doSomethingWith(entry)), Promise.resolve());它以一个已解决的承诺开始,并将一个then处理程序挂在上面以完成下一件事情,而后者将一个then处理程序挂在上面以完成下一件事情,等等。
如果您不喜欢在results上关闭,我们可以沿着reduce链传递它;下面是上面的第一个版本:
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);https://stackoverflow.com/questions/50375598
复制相似问题