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)
问题
循环在函数的其余部分结束.
解决办法是什么?
延续传递风格与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()来延迟执行其余的操作,或者等待处理用户输入,或者避免浏览器显示"慢速脚本"弹出窗口.)
你有一个错字:
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,因为如果您仍然遇到问题,这可能是至关重要的。