Javascript CPS(延续传递样式)实现

Javascript 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

因为,我尽量不使用“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 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()
延迟其余部分的执行,或等待处理用户输入,或避免浏览器显示“慢速脚本”弹出窗口。)