Javascript CPS(延续传递样式)实现
因为,我尽量不使用“return” 无CPSJavascript CPS(延续传递样式)实现,javascript,implementation,continuations,Javascript,Implementation,Continuations,因为,我尽量不使用“return” 无CPS function getter() { * calculate a* return a; } function test() { *part 1* if(*condition*) { a = getter(); } *use a* *part 2* } 过渡 函数的其余部分 } *use a* *part 2* 使用CPS function gett
function getter() {
* calculate a*
return a;
}
function test() {
*part 1*
if(*condition*) {
a = getter();
}
*use a*
*part 2*
}
过渡
函数的其余部分
}
*use a*
*part 2*
使用CPS
function getter() {
* calculate a*
continuationtest(a);
}
function test() {
*part 1*
if (*condition*) {
getter();
}
function continuationtest(a) {
}
*use a*
*part 2*
}
问题
循环在函数的其余部分结束
解决方案是什么?您有一个输入错误:
function continuationtest(a) {
}
*use a*
*part 2*
}
这可能是您想要的:
function continuationtest(a) {
*use a*
*part 2*
}
除此之外,很少的信息很难帮助您,例如
continuationtest
中会发生什么,因为如果您仍然存在问题,这可能非常关键。Continuation-passing样式与JavaScript循环不能很好地混合。您需要找到另一种方法来完成循环
请注意,您的代码的解释如下:
function test() {
*part 1*
if (*condition*) {
getter();
} // <--- note indentation here
function continuationtest(a) { // <--- and here
}
*use a*
*part 2*
}
使用CPS
function doSomething(i) {
alert("doing " + i);
}
function doLoop() {
for (i = 0; i < 9; i++)
doSomething(i);
}
function doSomething(i, ctn) {
alert("doing " + i);
ctn();
}
function doLoop() {
doLoopStartingAt(0);
function doLoopStartingAt(i) {
if (i < 9)
doSomething(i, function ctn() { doLoopStartingAt(i + 1); });
}
}
功能剂量测定法(i,ctn){
警惕(“做”+i);
ctn();
}
函数doLoop(){
doLoopStartingAt(0);
函数doLoopStartingAt(i){
如果(i<9)
doSomething(i,函数ctn(){doLoopStartingAt(i+1);});
}
}
(CPS的优点是,在任何时候,您都可以使用setTimeout()
延迟其余部分的执行,或等待处理用户输入,或避免浏览器显示“慢速脚本”弹出窗口。)