2009-11-30 13 views
5

Z powodu an article in IBM Developer Works about CPS (continuation passing style), staram się nie używać "return".JavaScript CPS (kontynuacja stylu przekazywania) implementacja

bez CPS

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

przejście

reszta funkcji

} 
    *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* 
} 

problem

Pętla kończy się resztą funkcji.

Jakie jest rozwiązanie?

Odpowiedz

0

Masz literówkę:

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

To może być to, czego chciał:

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

Poza tym, trudno będzie, aby pomóc w tak mało informacji, takich jak to, co będzie się działo w numerze continuationtest, ponieważ może to być krytyczne, jeśli nadal występują problemy.

6

Styl przejścia w dal nie pasuje do pętli JavaScript. Musisz znaleźć inny sposób na zrobienie pętli.

pamiętać, że kod jest interpretowany tak:

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

Więc nie jesteś zalogowany jako styl kontynuacją mijania w ogóle. Kiedy getter() dzwoni continuationtest(), prawdopodobnie się to nie udaje, ponieważ continuationtest() nie ma tam zasięgu.

Przykład CPS z pętlą może wyglądać następująco.

Bez CPS

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

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

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

(Zaletą CPS jest to, że w dowolnym momencie można użyć setTimeout() opóźnić wykonanie reszty, albo czekać na dane wejściowe użytkownika, które mają zostać przetworzone, lub unikaj wyświetlania w przeglądarce wyskakującego okienka "slow script").

Powiązane problemy