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

Del*_*ens 5 javascript continuations implementation

由于IBM Developer Works中有关CPS(继续传递样式)的文章,我试图不使用"return".

没有CPS

function getter() {
    * calculate a*
    return a;
}
function test() {
    *part 1*
    if(*condition*) {
         a = getter();
    }
    *use a*
    *part 2*
}
Run Code Online (Sandbox Code Playgroud)

过渡

剩下的功能

    }
    *use a*
    *part 2*
Run Code Online (Sandbox Code Playgroud)

与CPS

function getter() {
    * calculate a*
    continuationtest(a);
}
function test() {
    *part 1*
    if (*condition*) {
        getter();
}
function continuationtest(a) {
    }
    *use a*
    *part 2*
}
Run Code Online (Sandbox Code Playgroud)

问题

循环在函数的其余部分结束.

解决办法是什么?

Jas*_*rff 7

延续传递风格与JavaScript循环不能很好地融合.你需要找到另一种方法来完成循环.

请注意,您的代码的解释如下:

function test() {
    *part 1*
    if (*condition*) {
        getter();
    }                               // <--- note indentation here
    function continuationtest(a) {  // <--- and here
    }
    *use a*
    *part 2*
}
Run Code Online (Sandbox Code Playgroud)

因此,您目前根本没有使用延续传递方式.在getter()通话时continuationtest(),它可能会失败,因为continuationtest()它不在那里.

带循环的CPS示例可能如下所示.

没有CPS

function doSomething(i) {
    alert("doing " + i);
}

function doLoop() {
    for (i = 0; i < 9; i++)
        doSomething(i);
}
Run Code Online (Sandbox Code Playgroud)

随着CPS

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); });
    }
}
Run Code Online (Sandbox Code Playgroud)

(CPS的优点在于,您可以在任何时候使用它setTimeout()来延迟执行其余的操作,或者等待处理用户输入,或者避免浏览器显示"慢速脚本"弹出窗口.)


Jam*_*ack 0

你有一个错字:

function continuationtest(a) {
    }
    *use a*
    *part 2*
}
Run Code Online (Sandbox Code Playgroud)

这可能是您想要的:

function continuationtest(a) {
    *use a*
    *part 2*
}
Run Code Online (Sandbox Code Playgroud)

除此之外,很难提供如此少的信息,例如将发生什么continuationtest,因为如果您仍然遇到问题,这可能是至关重要的。