我有一个专用的网络工作人员,在收到启动信号后,它会进入一个长循环,并且根据某些启动设置,该循环将在给定的执行点“屈服”。
这是我的代码的简化版本
var mode = null;
var generator = null;
function* loop() {
for(var i=0;i<10000;i++) {
//Do stuff
for(var j=0;j<10000;j++) {
//Do stuff
if( mode == 'inner' ){
//Yield after each inner loop iteration
yield 2;
}
}
if( mode == 'outer' ){
//Yield after each outer loop iteration
yield 1;
}
}
/*
If mode is not inner or outer the function won't yield
and will process the whole loop in one shot
*/
return null;
}
generator = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个执行可中断计算的网络工作者。Worker.terminate()
我知道这样做的唯一方法(除了)是定期让步给消息循环,以便它可以检查是否有任何新消息。例如,这个网络工作者计算从 0 到 的整数之和data
,但是如果您在计算过程中向它发送一条新消息,它将取消计算并开始新的计算。
let currentTask = {
cancelled: false,
}
onmessage = event => {
// Cancel the current task if there is one.
currentTask.cancelled = true;
// Make a new task (this takes advantage of objects being references in Javascript).
currentTask = {
cancelled: false,
};
performComputation(currentTask, event.data);
}
// Wait for setTimeout(0) to complete, so that the event loop can receive any pending messages.
function yieldToMacrotasks() {
return new Promise((resolve) => setTimeout(resolve));
} …
Run Code Online (Sandbox Code Playgroud) 为了好玩,我试图创建不同排序算法的可视化,但我遇到了Canvas动画的问题.
我假设我只能在分拣机方法中调用绘图函数,但这会导致浏览器锁定,直到数组完全排序,然后绘制一些中间框架.
我如何从排序方法中进行动画制作?下面是我到目前为止的代码,我不会运行此代码片段,因为它将挂起标签几秒钟.
N = 250; // Array Size
XYs = 5; // Element Visual Size
Xp = 1; // Start Pos X
Yp = 1; // Start Pos Y
var canvas;
var l = Array.apply(null, {
length: N
}).map(Number.call, Number);
Array.prototype.shuffle = function() {
var i = this.length,
j, temp;
if (i == 0) return this;
while (--i) {
j = Math.floor(Math.random() * (i + 1));
temp = this[i];
this[i] = this[j];
this[j] = temp;
}
return this;
} …
Run Code Online (Sandbox Code Playgroud)javascript ×3
web-worker ×2
algorithm ×1
canvas ×1
ecmascript-6 ×1
event-loop ×1
html5 ×1
settimeout ×1
sorting ×1
yield ×1