2009-11-30 15 views
5

Debido a an article in IBM Developer Works about CPS (continuation passing style), intento no utilizar "return".Implementación de Javascript CPS (estilo de paso de continuación)

sin CPS

function getter() { 
    * calculate a* 
    return a; 
} 
function test() { 
    *part 1* 
    if(*condition*) { 
     a = getter(); 
    } 
    *use a* 
    *part 2* 
} 

transición

el resto de la función

} 
    *use a* 
    *part 2* 

con CPS

function getter() { 
    * calculate a* 
    continuationtest(a); 
} 
function test() { 
    *part 1* 
    if (*condition*) { 
     getter(); 
} 
function continuationtest(a) { 
    } 
    *use a* 
    *part 2* 
} 

el problema

Un ciclo finaliza en el resto de la función.

¿Cuál es la solución?

Respuesta

0

Usted tiene un error tipográfico:

function continuationtest(a) { 
    } 
    *use a* 
    *part 2* 
} 

Esto puede ser lo que quería:

function continuationtest(a) { 
    *use a* 
    *part 2* 
} 

Aparte de eso, va a ser difícil para ayudar con tan poca información, como por ejemplo lo que sucederá en el continuationtest, ya que eso podría ser crítico si todavía tiene problemas.

6

El estilo de continuación de paso no se combina bien con los bucles de JavaScript. Necesitas encontrar otra forma de hacer el ciclo.

Tenga en cuenta que el código se interpreta así:

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

Así que no está usando el estilo de continuación que pasa en absoluto. Cuando getter() llama al continuationtest(), probablemente esté fallando, ya que continuationtest() no está en el alcance allí.

Un ejemplo de CPS con un bucle podría verse así.

Sin CPS

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

function doLoop() { 
    for (i = 0; i < 9; i++) 
     doSomething(i); 
} 

Con 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); }); 
    } 
} 

(La ventaja de CPS es que en cualquier momento se puede utilizar setTimeout() para retrasar la ejecución del resto, o esperar la entrada del usuario debe procesarse, o evitar que el navegador muestre una ventana emergente de "escritura lenta")

Cuestiones relacionadas