Реализация Javascript CPS (стиль передачи продолжения) - PullRequest
5 голосов
/ 30 ноября 2009

Из-за статьи в IBM Developer Works о CPS (стиль передачи продолжения) я пытаюсь не использовать «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*
}

проблема

Цикл заканчивается в остальной части функции.

Какое решение?

Ответы [ 2 ]

6 голосов
/ 30 ноября 2009

Стиль передачи продолжения плохо сочетается с циклами JavaScript. Вам нужно найти другой способ сделать цикл.

Обратите внимание, что ваш код интерпретируется так:

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

Таким образом, вы в настоящее время вообще не используете стиль передачи продолжения. Когда getter() вызывает continuationtest(), это, вероятно, дает сбой, поскольку continuationtest() там не находится.

Пример CPS с циклом может выглядеть следующим образом.

Без CPS

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

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

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

(Преимущество CPS заключается в том, что в любой момент вы можете использовать setTimeout(), чтобы отложить выполнение остальных, или дождаться обработки пользовательского ввода, или избежать отображения в браузере всплывающего окна «медленный скрипт».)

0 голосов
/ 30 ноября 2009

У вас есть опечатка:

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

Это может быть тем, что вы хотели:

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

Кроме этого, будет трудно помочь с таким небольшим количеством информации, такой как то, что произойдет в continuationtest, поскольку это может иметь решающее значение, если у вас все еще есть проблемы.

...