gpt4 book ai didi

javascript - 将同步代码插入异步代码

转载 作者:行者123 更新时间:2023-12-03 02:37:44 25 4
gpt4 key购买 nike

我正在运行 lighthouse cli针对约 50 个站点列表。我只是在 .forEach 循环中运行它,如果我理解的话,它是阻塞的,也就是同步的。然而,我最终一次性启动了 50 个 Chrome Canary 实例。根据我对这些事情的有限理解,我认为线程是同步启动的,但是 Node 可以将线程传递给内核并愉快地启动下一个线程。再说一遍,这只是我对正在发生的事情的粗略理解。

我正在使用这个从某处抄来的函数:

function launchChromeAndLighthouse(url, opts, config = null) {
return chromeLauncher.launch({chromeFlags: opts.chromeFlags}).then(chrome => {
opts.port = chrome.port;
return lighthouse(url, opts, config).then(results =>
chrome.kill().then(() => results));
});
}

我在循环中尝试了nextTick:

asyncFuncs().then( async (sites) => {
sites.forEach( (site) => {
process.nextTick(launchChromeAndRunLighthouse(site.url, opts))
})
})

但这仍然会产生一堆 Chrome 实例。当一座灯塔完成时如何暂停执行?

最佳答案

由于 launchChromeAndRunLighthouse() 返回一个 promise 来标记何时完成,如果您只想一次连续运行它们,您可以切换到 for 循环并使用await:

asyncFuncs().then( async (sites) => {
for (let site of sites) {
await launchChromeAndRunLighthouse(site.url, opts);
}
});

如果您尝试收集所有结果:

asyncFuncs().then( async (sites) => {
let results = [];
for (let site of sites) {
let r = await launchChromeAndRunLighthouse(site.url, opts);
results.push(r);
}
return results;
}).then(results => {
// all results here
}).catch(err => {
// process error here
});
<小时/>

如果您想一次运行 N 个 chrome 实例,以便它最初启动 N 个实例,然后每次一个实例完成时,您启动下一个正在等待的实例,这样跟踪正在运行的实例数量会更复杂。在这些答案中,有一个辅助函数调用 pMap()mapConcurrent() 可以为您完成此操作:

Make several requests to an API that can only handle 20 request a minute

Promise.all consumes all my RAM

<小时/>

Bluebird Promise libraryPromise.map() function 中也有并发控制.

关于javascript - 将同步代码插入异步代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48472215/

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