gpt4 book ai didi

javascript - 如何围绕 Web Workers API 编写 Promise 包装器?

转载 作者:行者123 更新时间:2023-11-28 17:01:01 25 4
gpt4 key购买 nike

我正在编写一个使用 Web Workers 的库。库的使用者不应该看到任何 Web Worker 的内容,而应该从该库的公共(public)方法返回一个 Promise,如下所示:

// consumer.js

const api = new Api();

api.doCalculation(input1).then(data => console.log(data));
api.doCalculation(input2).then(data => console.log(data));
api.doCalculation(input3).then(data => console.log(data));

在我的库代码中,我有一个包装 Web Worker 逻辑的类。在构造函数中,我创建工作线程并设置“消息”事件监听器,监听来自工作线程的传入数据。在这个类中还有一个 doCalculation(input) 方法,该方法对库的使用者是公开的。它获取输入并将其发送到工作线程以执行实际计算。

// api.js

class Api {
constructor() {
this.worker = new Worker('worker.js');

this.worker.addEventListener('message', (e) => {

// I want to return this e.data from the doCalculation method
console.log(e.data);
});
}

doCalculation(input) {
this.worker.postMessage({input: input});

// I want to return a Promise from this method,
// holding the result e.data
}
}

我现在的问题是,如何从保存 e.datadoCalculation 方法返回 Promise?

我的第一个意图是这样的,但这显然行不通,因为每次调用 doCalculation 时都会创建一个新的“消息”事件监听器。

// api.js

class Api {
constructor() {
this.worker = new Worker('worker.js');
}

doCalculation(input) {
this.worker.postMessage({input: input});
return new Promise((resolve => {
this.worker.addEventListener('message', (e) => {
resolve(e.data);
});
}))
}
}

这里的所有代码示例都经过简化,只是为了让我的观点更清楚。

如果您能提供任何正确方向的提示,我将不胜感激!

最佳答案

当然,您可以将 resolve 存储在某个地方,例如在一个对象中:

 this.resolvers = {};
this.count = 0; // used later to generate unique ids

然后,对于发送到网络 worker 的每个任务,创建一个唯一的 ID,并将 Promise 解析器存储在那里

 const id = this.count++;
// Send id and task to WebWorker
return new Promise(resolve => this.resolvers[id] = resolve);

然后,当 webworker 发送消息时,从中获取 id,并解析存储的 Promise:

 this.resolvers[ id ](data);
delete this.resolvers[id]; // Prevent memory leak

这样一来 (1) 您只需要注册一个处理程序,(2) webworker 可以同时处理多个任务,并且 (3) 您可以通过检查 Object.keys(this.resolvers).

关于javascript - 如何围绕 Web Workers API 编写 Promise 包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57495988/

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