gpt4 book ai didi

javascript - 如果在无限循环中运行,有限数量的 JavaScript Promise 将不起作用

转载 作者:行者123 更新时间:2023-12-01 03:38:16 24 4
gpt4 key购买 nike

我的想法是。我的 worker 数量有限。这些 worker 必须做一些工作。当 worker 完成工作后,他必须承担其他工作,直到完成所有工作。

我写了这段代码:

function createWorker(num){
this.num = num;

this.Run = (job) => (
new Promise(
(resolve, reject) => {
setTimeout(() => { resolve({worker: this, num: this.num, job: job}); }, 5000);
}
)
);
}

function Processing(maxWorkers, jobs){
this.Workers = [];
this.Jobs = jobs;

this.Go = () => {
return new Promise(
(resolve, reject) => {
while(true){
let worker = this.Workers.pop();

if (!worker) continue;

let job = this.Jobs.pop();

if (!job) break;

worker.Run(job)
.then(
res => {
console.log(res);
this.Workers.push(res.worker);
}
);
}

resolve("Complete");
}
)
}

for(var i = 0; i < maxWorkers; i++){
this.Workers.push(new createWorker(i));
}
}

let jobs = ['a', 'b', 'c', 'd', 'e'];

let proc = new Processing(3, jobs);
proc.Go()
.then(
res => {
console.log(res);
}
);

一项工作的代码运行良好

let worker = new createWorker(1);
worker.Run("a")
.then(
res => {
console.log("Complete " + res.num + " job " + res.job);
}
);

为什么我的代码不起作用?看起来像结冰了。

最佳答案

在 javascript 中,仅当没有 javascript 代码需要处理时才会处理事件循环。这是因为 javascript 是单线程的。因此事件循环不能与 JavaScript 代码并行处理。解释器的基本结构是:

       execute javascript code ----------->  process event loop
^ |
| |
'---------------------------------'

有鉴于此,JavaScript 代码中的无限循环意味着事件循环永远不会被处理。

那么这与网络 worker 有什么关系呢?好吧,网络 worker 在自己的线程中执行,因此它们与无限循环并行运行。然而,我们从网络 worker 那里获取数据的方式是:

worker.Run(job).then()

这需要事件循环才能运行。因此,虽然工作程序可以与无限循环并行运行,但不会处理无限循环和工作程序之间的通信,因为您没有让解释器有机会处理事件循环。

您不能在 JavaScript 应用程序中使用无限循环。

然后该怎么办?

解决方案是使用事件循环。如果您想要定期异步循环,请使用 setTimeout()setInterval()。或者通过在 .then() 内再次“递归”调用该函数进行循环,直到处理完所有内容。

关于javascript - 如果在无限循环中运行,有限数量的 JavaScript Promise 将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44086784/

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