gpt4 book ai didi

javascript - Promise.allSettled 永远卡住

转载 作者:行者123 更新时间:2023-12-03 17:22:26 27 4
gpt4 key购买 nike

我使用 Promise.allSettled 以批量方式获取网站。如果我将网站列表的大小限制为 10,它可以正常工作,但一旦我将其增加到 1000,它就会卡住。

这很奇怪,我从来没有发生过。我已经等了三天直到脚本完成,但它仍然停留在第一个 1000 项上。

const rp = require('request-promise');
const lineReader = require('line-by-line');

const reader = new lineReader("./all.json");

let lines = [];
const limit = 1000;

let successCount = 0;

reader.on('line', async (line) => {
line = JSON.parse(line);

lines.push(line);

if (lines.length === limit) {
reader.pause();

let promises = [];

for (const line of lines) {
promises.push(rp(line.website))
}

await Promise.allSettled(promises);

successCount++
console.log(`Success Count is ${successCount}`);

lines = [];

reader.resume();
}
});

data.json 文件包含以下格式的网站列表,

{ website: "https://www.google.com" }
{ website: "https://www.bing.com" }
{ website: "https://www.microsoft.com" }

您可以通过将类似 { website: "https://www.google.com"} 的行复制 2000 次来重现该行为。

最佳答案

解决方案是用一个在一定时间后超时的 promise 来结束我的 promise 。

这里是提供超时能力的函数,

const withTimeout = (millis, promise) => {
const timeout = new Promise((resolve, reject) =>
setTimeout(
() => reject(`Timed out after ${millis} ms.`),
millis));
return Promise.race([
promise,
timeout
]);
};

你可以像下面这样使用它,

await Promise.allSettled([
withTimeout(5000, rp("https://www.google.com"),
withTimeout(5000, rp("https://www.bing.com"),
]));

我知道您可以在请求 promise 选项中指定超时,但出于某种原因它对我不起作用,但我在添加它时注意到某些改进。

关于javascript - Promise.allSettled 永远卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66733791/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com