 Daisuke Maki ſ 
ȻԽԽվӦAJAXпǹһӵAJAXӦȻһ⡣ЩѵҪԭʲôأ첽ͨ⣿GUIأͨɵģǾΪοһʵͬܵAJAXӦþôأ 
AJAX е 
ͨһ򵥵ʶ⡣ҪһνṹĹϵͳ(BBS)Ըûн̬ÿƪµϢһԴӷϢÿƪĸԣϵͳпΪΨһʶIDԼ IDϢȼٶһΪgetArticle()ĺԼһƪϢúյĲҪµIDͨɴӷȡϢصĶصԣidnamecontentchildren£ 
function ( id ) { 
    var a = getArticle(id); 
    document.writeln(a.name + " 
" + a.content); 
} 
ȻҲע⵽ظͬһIDô˺Ҫ֮зͨšҪ⣬Կʹú getArticleWithCache()൱һлgetArticle()УgetArticle()صֻΪһȫֱ 
var cache = {}; 
function getArticleWithCache ( id ) { 
    if ( !cache[id] ) { 
        cache[id] = getArticle(id); 
    } 
    return cache[id]; 
} 
ѽ»һºbackgroundLoad()ӦᵽĻƼϢ;ǣĶĳƪʱӺ̨Ԥ¡Ϊ״ṹģԺдһݹ㷨Ҽе£ 
function backgroundLoad ( ids ) { 
    for ( var i=0; i < ids.length; i++ ) { 
        var a = getArticleWithCache(ids[i]); 
        backgroundLoad(a.children); 
    } 
} 
backgroundLoad ()һIDΪȻͨÿIDǰ涨getArticldWithCache()ͰÿIDӦ»֮ͨѼµIDݹbackgroundLoad()ͱ 
ĿǰΪֹһƺȻֻҪйAJAXӦõľ飬Ӧ֪ɵʵַɹӳĻĬ getArticle()õͬͨšǣΪһԭJavaScriptҪнʱҪ첽ͨţΪǵ̵߳ġͼԶԣÿһ飨GUI¼Ⱦһ߳һܺõĳģͣΪٿ߳ͬЩ⡣һ棬Ҳ¶Ӧÿеһ⣬̻߳ûӦѸ٣ǵ߳æڴʱ(˵getArticle())Ͳܶûͼ̲Ӧ 
̻߳ͬͨŻᷢʲôأͬͨŻжֱִͨŽڵȴͨŽĹУڷĵûûɣֹ̻߳ͣӦû״ֱ̬÷ءΪԭ򣬵ڵȴӦʱܶûΪӦԿǶˡִ getArticleWithCache()backgroundLoad()ͬ⣬ΪǶǻgetArticle()ġе¿ܻķѺܿɹ۵һʱ䣬˶backgroundLoad()˵ڴ˶ʱڵĶһص⡪ȻѾᣬûĶʱͲȥִк̨Ԥݣǰ¶û취 
Ȼͬͨʹлص⣬JavaScriptͰ첽ͨΪһԭˣǿԻ첽ͨŸдĳ JavaScriptҪһ¼ĳƷʽд첽ͨųںܶೡУ㶼ָһصһյͨӦͻᱻá磬涨getArticleWithCache()д 
var cache = {}; 
function getArticleWithCache ( id, callback ) { 
    if ( !cache[id] ) { 
        callback(cache[id]); 
    } else { 
        getArticle(id, function( a ){ 
            cache[id] = a; 
            callback(a); 
        }); 
    } 
} 
ҲڲgetArticle()ȻҪעǣΪ첽ͨƵgetArticle()ҪһΪڶgetArticle()ʱǰһҪһ󣬲ͬǣںѸٷضǵȴӦζţִȨظóʱûеõӦһ߳̾Ϳȥֱִ÷ӦڴʱûصһõӦ getArticle()ĵڶΪԤȶĻصҪãķֵΪͬģgetArticleWithCache ()ҲҪЩı䣬һصΪڶصڱgetArticle()ĻصеãڷͨŽִС 
ЩĶѾΪ൱ˣǶbackgroundLoad()øĶӣҲҪдɿԴصʽ 
function backgroundLoad ( ids, callback ) { 
    var i = 0; 
    function l ( ) { 
        if ( i < ids.length ) { 
            getArticleWithCache(ids[i++], function( a ){ 
                backgroundLoad(a.children, l); 
            }); 
        } else { 
            callback(); 
        } 
    } 
    l(); 
} 
ĶbackgroundLoad()ȥǰǸѾȥԶʵֵĹܲ޶¡ζ IDΪÿԪضҪgetArticleWithCache()ӦѾIDݹ backgroundLoad ()ͬǶѭʣºеľͲ̫ñˣǰĳһforѭɵġΪʲôʵͬܵ׺˵Ĵྶͥأ 
ԴһʵκκҪͬͨ󣬶̷أgetArticleWithCache()ԭĺִеУӦܷӦĻصܱáJavaScriptѭжϳԺϵʼִгǲܵģһfor䡣ˣõݹ鴫ݻصʵѭṹһͳѭ䡣ЩϤͷ(CPS)˵һ CPSֶʵ֣Ϊʹѭ﷨Լǰᵽıô򵥵ĳҲдúܸӡ¼صǿ⣺ѭʽܱȽ⡣ 
ﻹһ⣺һûӦ첽ͨŵĺתΪһʹ첽ͨŵĺôдĺҪһصΪΪѾڵAPIs˺ܴ⣬ΪڵĸıûаӰڲǵҵAPIsԼAPIʹߵĸı䡣 
ЩĿĸԭʲôأûJavaScript̻߳ƵЩ⡣ڵִ߳첽ͨҪ¼ƺ͸ӵ䡣ڵȴӦʱһ߳̿ûôӼͲҪˡ 
Զ̱߳ 
һConcurrent.ThreadһJavaScriptж̵̱߳Ŀ⣬ӦԴ󻺽ἰ AJAX첽ͨصѡһJavaScriptдɵѵ⣬ʹǰMozilla Public LicenseGNU General Public LicenseЭ顣Դǵվ Դ롣 
غʹԴɣٶѾصԴ뱣浽һΪConcurrent.Thread.jsļڽκβ֮ǰ³һܼ򵥵Ĺʵ֣ 
<script type="text/javascript" src="Concurrent.Thread.js"> </script> 
<script type="text/javascript"> 
    Concurrent.Thread.create(function(){ 
        var i = 0; 
        while ( 1 ) { 
            document.body.innerHTML += i++ + " <br>"; 
        } 
    }); 
</script> 
ִ򽫻˳ʾ0ʼ֣һһ֣Թϸоһ´룬Ӧwhile(1)һֹѭͨ£ʹһΨһһ̵߳JavaScriptᵼ󶳽һȻҲͲôΪʲôγôأؼ֮while(1)Concurrent.Thread.create()䣬ṩһԴһ̡߳ĺִ߳УǶԳ΢ 
<script type="text/javascript" src="Concurrent.Thread.js"> </script> 
<script type="text/javascript"> 
    function f ( i ){ 
        while ( 1 ) { 
            document.body.innerHTML += i++ + " <br>"; 
        } 
    } 
    Concurrent.Thread.create(f, 0); 
    Concurrent.Thread.create(f, 100000); 
</script> 
иºf()ظʾ֣ڳʼģf()Ϊcreate()create()ĵڶ᲻޸ĵشf()ִȻῴһЩ0ʼСһЩ100,000ʼĴȻǽǰС˳֡Թ۲쵽ڽʾСʹ˵߳ͬʱС 
չʾConcurrent.Threadһ÷ӵcreate()̡߳ÿκAPIsҲпʵĿġ磬ǰǸӿд 
<script type="text/javascript" src="Concurrent.Thread.js"> </script> 
<script type="text/x-script.multithreaded-js"> 
    var i = 1; 
    while ( 1 ) { 
        document.body.innerHTML += i++ + " <br>"; 
    } 
</script> 
script ǩڣܼ򵥵JavaScriptдһѭӦע⵽ǩڵtypeԣһİֵ(text/x- script.multithreaded-js)ԱscriptǩڣôConcurrent.Threadͻһµִ߳бǩ֮ĳӦסһ㣬ڱһ뽫Concurrent.Thread 
Concurrent.ThreadпĽִл֮߳лʹĳܳԺǿǿԼҪֲִ֮ҪдתԵؽҪѴݸcreate()ĺתһַŸдֱԱִִСȻЩյȳִСȳЭ̣߳仰˵ʵʱԱÿһ޸ĺĺõͬȻС Concurrent.Threadʵϲûдµ̣߳ԭ̵߳Ļģһ̻߳ 
Ȼתĺڲͬ߳ڣʵֻһ߳е顣תĺִͬͨȻᣬҲΪǰЩûн㲻صģConcurrent.ThreadṩһӦJavaScript 첽ͨŷʽʵֵĶͨſ⣬Ƴɵһ߳ڵȴӦʱ߳Сͨſ Concurrent.Thread.Http¡÷ʾ 
<script type="text/javascript" src="Concurrent.Thread.js"> </script> 
<script type="text/x-script.multithreaded-js"> 
    var req = Concurrent.Thread.Http.get(url, ["Accept", "*"]); 
    if (req.status == 200) { 
        alert(req.responseText); 
    } else { 
        alert(req.statusText); 
    } 
</script> 
get()ְʾͨHTTPGETָURLݣĿURLΪһһHTTP ͷΪѡĵڶget()õӦͷһXMLHttpRequestΪֵ get()ʱѾյ˷ӦԾûҪûصսȻҲٵĵȴӦʱˡ⣬һ post()ݵ 
<script type="text/javascript" src="Concurrent.Thread.js"> </script> 
<script type="text/x-script.multithreaded-js"> 
    var req = Concurrent.Thread.Http.post(url, "key1=val1&key2=val2"); 
    alert(req.statusText); 
</script> 
post()ĿURLΪһҪ͵Ϊڶget()ҲԽͷΪѡĵ 
ͨſʵ˵һӵеgetArticle()ôܿӦ¿ͷʾּ򵥵ķд getArticleWithCache(),backgroundLoad ()ԼgetArticle()ĺˡʹǰbackgroundLoad()ڶݣһ߳̿ԶûӦҲᶳᡣڣJavaScriptӦö߳жʵˣ 
˽ 
һJavaScriptӦö̵߳Ŀ⣺Concurrent.ThreadƪµֻǺܳĶ˽⣬Ƽȥthe tutorialṩйConcurrent.Thread÷ĸݣг˿ɹ߼ûʹõĵʺ𲽵ĲϡǵվҲṩϢ 
й 
Daisuke Maki International ChristianѧĿѧԺȻѧֲҵȡѧѧʿѧλElectro-CommunicationsѧоԺϢרҵ˶ʿѧλóWebӦJavaScriptAJAXConcurrent.Thread2006ձϢٽIPAָĿExplatory Software ProjectӦơ 
ĿǰѾӵһѧ˶ʿѧλElectro-CommunicationsѧоԺעṥʿѧλ