2009-11-30 36 views
5

an article in IBM Developer Works about CPS (continuation passing style), tôi đang cố gắng không sử dụng "trả lại".Thực thi Javascript CPS (tiếp tục theo kiểu tiếp tục)

mà không CPS

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

chuyển

phần còn lại của hàm

} 
    *use a* 
    *part 2* 

với CPS

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

vấn đề

Vòng lặp kết thúc ở phần còn lại của hàm.

Giải pháp là gì?

Trả lời

0

Bạn có một typo:

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

Đây có thể là những gì bạn muốn:

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

Khác hơn thế, nó sẽ được khó khăn để giúp đỡ với thông tin quá ít, chẳng hạn như những gì sẽ xảy ra trong số continuationtest, vì điều đó có thể rất quan trọng nếu bạn vẫn gặp sự cố.

6

Kiểu chuyển tiếp tục không kết hợp tốt với các vòng JavaScript. Bạn cần phải tìm một cách khác để thực hiện vòng lặp.

Lưu ý rằng mã của bạn đã được giải thích như thế này:

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

Vì vậy, bạn không đang sử dụng phong cách tiếp-đi qua cả. Khi getter() gọi continuationtest(), có thể không thành công, vì continuationtest() không nằm trong phạm vi đó.

Ví dụ về CPS có vòng lặp có thể trông giống như thế này.

Without CPS

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

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

Vớ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); }); 
    } 
} 

(Ưu điểm của CPS là bất cứ lúc nào bạn có thể sử dụng setTimeout() để trì hoãn thực hiện phần còn lại, hoặc chờ đợi đầu vào của người dùng được xử lý hoặc tránh trình duyệt hiển thị cửa sổ bật lên "tập lệnh chậm".)

Các vấn đề liên quan