我在想,除了用这种方式,在JavaScript中还有其他方法可以实现多线程吗?还有其他重要的方法吗?
你可以将代码转换成JavaScript代码,其中没有任何显式循环或直接函数调用,而是将代码分成小的
执行单元,由线程引擎管理。在我的示例代码中,我展示了一个带有循环的函数如何被转换,但为了保持示例简单,我省略了函数调用的机制。
转换的过程基本上是通过在分割点处
分割代码。这些分割点是函数调用和循环(如上所示)。在示例中,我使用了对象和键,但是如果
单元将
堆栈存储为对象变量(即使用
this.foo = bar
而不是
stack["foo"] = bar
),它可能更容易在浏览器的JavaScript引擎上运行。
例如以下代码:
function Foo() {
var i,
sum = 0,
accumulator_list = [],
accumulator_modulus = [],
kMaxAccumulatorCount = 100;
for(i = 0; i < kMaxAccumulatorCount; ++i) {
current_accumulator = GetNextAccumulator()
accumulator_list[i] = current_accumulator;
sum = sum + current_accumulator;
}
for(i = 0; i < kMaxAccumulatorCount; ++i) {
current_accumulator = accumulator_list[i];
accumulator_modulus[i] = current_accumulator % kMaxAccumulatorCount;
}
}
将文本转换成这样的形式:
function Foo_A(caller,stack) {
var stack = {};
stack["i"] = undefined;
stack["sum"] = 0;
stack["accumulator_list"] = [];
stack["accumulator_modulus"] = [];
stack["kMaxAccumulatorCount"] = 100;
stack["i"] = 0;
return {caller: caller, stack: stack, next=Foo_B};
}
function Foo_B(caller, stack) {
stack["current_accumulator"] = GetNextAccumulator();
stack["accumulator_list"][stack["i"]] = stack["current_accumulator"];
stack["sum"] = stack["sum"] + stack["current_accumulator"];
if(stack["i"] < stack["kMaxAccumulatorCount"]) {
++stack["i"];
return {caller: caller, stack: stack, next:Foo_B};
} else {
stack["i"] = 0;
return {caller: caller, stack: stack, next:Foo_C};
}
}
function Foo_C(caller, stack) {
stack["current_accumulator"] = stack["current_accumulator"][stack["i"]];
stack["accumulator_modulus"][stack["i"]] = stack["current_accumulator"] % stack["kMaxAccumulatorCount"];
if(stack["i"] < stack["kMaxAccumulatorCount"]) {
++stack["i"];
return {caller: caller, stack: stack, next:Foo_C};
} else {
return {caller: caller, stack: stack, next:null};
}
}