【发布时间】:2020-12-09 16:45:55
【问题描述】:
我的工人向主脚本发送消息,然后主脚本做出响应。 我想在继续工作之前等待响应,因为响应包含我需要的信息 (memoryAvailable)。
Main.js
export function convert(){
let managingWorker = new Worker("managingWorker.js");
let fileNode = document.querySelector('.fileInput');
managingWorker.postMessage({fileList:fileNode.files, msgType:"processData", options:{delimiter:
document.querySelector('#specifyDelimiter').value.trim() || ","}});
managingWorker.onmessage = function(e){
switch(e.data.msgType){
case "memoryInfoRequested":
let memAvail = performance.memory.jsHeapSizeLimit - performance.memory.totalJSHeapSize;
managingWorker.postMessage({msgType:"memoryInfoReceived", memoryAvailable: memAvail});
break;
//Other cases for updating the UI
}
managingWorker.js
let memoryAvailable = 0;
onmessage = function(e){
switch(e.data.msgType){
case "processData":
workerStuff(e)
break;
case "memoryInfoReceived":
memoryAvailable = e.data.memoryAvailable
break;
}
}
function workerStuff(f){
//do stuff
postMessage({msgType:"memoryInfoRequested"})
//do more stuff if there is enough memory available, else wait
}
我已经尝试过: 在工作人员中放置一个while循环 while(memoryAvailable
我目前在想我可以使用 async await 和 setTimeout 暂停 x 毫秒,然后在解决承诺时,应该传递消息,但即使我让它工作,它也不是最佳的解决方案。 *我的大脑现在有点炸了,所以也许晚饭后我会尝试这样的。
【问题讨论】:
-
这是一个 generic solution 用于等待工作任务作为承诺。
-
@ThomasRones 我修改了我的答案,加入了一个循环,等待有足够的可用内存。
标签: javascript worker