2009-11-30 10 views
5

Çünkü an article in IBM Developer Works about CPS (continuation passing style), ben "geri dönüşü" kullanmayın çalışıyorum.JavaScript CPS (devamı geçme tarzı) uygulaması

CPS

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

geçiş

fonksiyonun geri kalan

} 
    *use a* 
    *part 2* 

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

sorun

CPS ile

Bir döngü işlevin geri kalanında biter.

çözümü nedir?

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

Bu olabilir ne istediğini:

cevap

0

Bir yazım hatası var bundan daha

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

Diğer, böyle ne olacağı şekilde az bilgi, yardım etmek zor olacak continuationtest'da hala sorun yaşıyorsanız kritik olabilir.

6

Devam geçirme stili JavaScript döngüleriyle iyi karışmaz. Döngüyü yapmak için başka bir yol bulmalısın. kod aşağıdaki gibi yorumlanır ediliyor

Not:

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

Yani şu anda hiç devamı geçme tarzı kullanmıyorsunuz. getter(), continuationtest() çağırdığında, büyük olasılıkla başarısız olur, çünkü continuationtest() buradaki kapsamda değildir.

Döngü içeren bir CPS örneği böyle görünebilir. 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); }); 
    } 
} 

ile CPS

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

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

olmadan

(CPS avantajı Herhangi bir noktada geri kalanı yürütülmesini geciktirmek için setTimeout() kullanabilir veya beklemek olmasıdır kullanıcı girdisi işlenecek veya tarayıcıdan "yavaş betik" penceresi açılmamalıdır.)