欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

小試JavaScript多線程第1/2頁

 更新時間:2025年03月02日 21:42:09   投稿:mdxy-dxy  
這兩天一直在弄ajax,用多了才發(fā)現(xiàn)了ajax?的cache問題,請求了好多次,得到了確是相同的結(jié)果,經(jīng)常我想在請求的同時去做一些其它的事情,我在想javascript里有沒有辦法用多線程,經(jīng)過在網(wǎng)上查找找到了結(jié)果。

法寶就是Concurrent.Thread這個家伙,其實是一個js庫,你可以從網(wǎng)站下載源代碼.如何使用呢?
很簡單
Concurrent.Thread.create(f, a1, a2, ...) f為你要調(diào)用的函數(shù),a1,a2為該函數(shù)的參數(shù),這樣創(chuàng)建了一個線程,你可以同時創(chuàng)建多個,他們會同時去執(zhí)行,這個庫同時提供 了很多的方法,類似其它語言里的Thread使用方法,如Concurrent.Thread.stop();等。具體去網(wǎng)站去了解。

復(fù)制代碼 代碼如下:

<html>
<body>
<script type="text/javascript" src="Concurrent.Thread.Compiler.js"></script>
<script type="text/javascript">
function hello ( ) {
document.body.innerHTML += "H";
document.body.innerHTML += "e";
document.body.innerHTML += "l";
document.body.innerHTML += "l";
document.body.innerHTML += "o";
document.body.innerHTML += ",";
document.body.innerHTML += " ";
document.body.innerHTML += "w";
document.body.innerHTML += "o";
document.body.innerHTML += "r";
document.body.innerHTML += "l";
document.body.innerHTML += "d";
document.body.innerHTML += "!";
}
Concurrent.Thread.create(hello);
</script>
</body>
</html>

作者 Daisuke Maki譯者 張凱峰
雖然有越來越多的網(wǎng)站在應(yīng)用AJAX技術(shù)進行開發(fā),但是構(gòu)建一個復(fù)雜的AJAX應(yīng)用仍然是一個難題。造成這些困難的主要原因是什么呢?是與服務(wù)器的異步通信問題?還是GUI程序設(shè)計問題呢?通常這兩項工作都是由桌面程序來完成的,那究竟為何開發(fā)一個可以實現(xiàn)同樣功能的AJAX應(yīng)用就這么困難呢?
AJAX 開發(fā)中的難題
讓我們通過一個簡單的例子來認識這個問題。假設(shè)你要建立一個樹形結(jié)構(gòu)的公告欄系統(tǒng)(BBS),它可以根據(jù)用戶請求與服務(wù)器進行交互,動態(tài)加載每篇文章的信息,而不是一次性從服務(wù)器載入所有文章信息。每篇文章有四個相關(guān)屬性:系統(tǒng)中可以作為唯一標識的ID、發(fā)貼人姓名、文章內(nèi)容以及包含其所有子文章 ID的數(shù)組信息。首先假定有一個名為getArticle()的函數(shù)可以加載一篇文章信息。該函數(shù)接收的參數(shù)是要加載文章的ID,通過它可從服務(wù)器獲取文章信息。它返回的對象包含與文章相關(guān)的四條屬性:id,name,content和children。例程如下:
function ( id ) {
var a = getArticle(id);
document.writeln(a.name + "
" + a.content);
}
然而你也許會注意到,重復(fù)用同一個文章ID調(diào)用此函數(shù),需要與服務(wù)器之間進行反復(fù)且無益的通信。想要解決這個問題,可以考慮使用函數(shù) getArticleWithCache(),它相當于一個帶有緩存能力的getArticle()。在這個例子中,getArticle()返回的數(shù)據(jù)只是作為一個全局變量被保存下來:
var cache = {};
function getArticleWithCache ( id ) {
if ( !cache[id] ) {
cache[id] = getArticle(id);
}
return cache[id];
}
現(xiàn)在已將讀入的文章緩存起來,讓我們再來考慮一下函數(shù)backgroundLoad(),它應(yīng)用我們上面提到的緩存機制加載所有文章信息。其用途是,當讀者在閱讀某篇文章時,從后臺預(yù)加載它所有子文章。因為文章數(shù)據(jù)是樹狀結(jié)構(gòu)的,所以很容易寫一個遞歸的算法來遍歷樹并且加載所有的文章:
function backgroundLoad ( ids ) {
for ( var i=0; i < ids.length; i++ ) {
var a = getArticleWithCache(ids[i]);
backgroundLoad(a.children);
}
}
backgroundLoad ()函數(shù)接收一個ID數(shù)組作為參數(shù),然后通過每個ID調(diào)用前面定義過的getArticldWithCache()方法,這樣就把每個ID對應(yīng)的文章緩存起來。之后再通過已加載文章的子文章ID數(shù)組遞歸調(diào)用backgroundLoad()方法,如此整個文章樹就被緩存起來。
到目前為止,一切似乎看起來都很完美。然而,只要你有過開發(fā)AJAX應(yīng)用的經(jīng)驗,你就應(yīng)該知曉這種幼稚的實現(xiàn)方法根本不會成功,這個例子成立的基礎(chǔ)是默認 getArticle()用的是同步通信??墒牵鳛橐粭l基本原則,JavaScript要求在與服務(wù)器進行交互時要用異步通信,因為它是單線程的。就簡單性而言,把每一件事情(包括GUI事件和渲染)都放在一個線程里來處理是一個很好的程序模型,因為這樣就無需再考慮線程同步這些復(fù)雜問題。另一方面,他也暴露了應(yīng)用開發(fā)中的一個嚴重問題,單線程環(huán)境看起來對用戶請求響應(yīng)迅速,但是當線程忙于處理其它事情時(比如說調(diào)用getArticle()),就不能對用戶的鼠標點擊和鍵盤操作做出響應(yīng)。
如果在這個單線程環(huán)境里進行同步通信會發(fā)生什么事情呢?同步通信會中斷瀏覽器的執(zhí)行直至獲得通信結(jié)果。在等待通信結(jié)果的過程中,由于服務(wù)器的調(diào)用還沒有完成,線程會停止響應(yīng)用戶并保持鎖定狀態(tài)直到調(diào)用返回。因為這個原因,當瀏覽器在等待服務(wù)器響應(yīng)時它不能對用戶行為作出響應(yīng),所以看起來像是凍結(jié)了。當執(zhí)行 getArticleWithCache()和backgroundLoad()會有同樣的問題,因為它們都是基于getArticle()函數(shù)的。由于下載所有的文章可能會耗費很可觀的一段時間,因此對于backgroundLoad()函數(shù)來說,瀏覽器在此段時間內(nèi)的凍結(jié)就是一個很嚴重的問題——既然瀏覽器都已經(jīng)凍結(jié),當用戶正在閱讀文章時就不可能首先去執(zhí)行后臺預(yù)加載數(shù)據(jù),如果這樣做連當前的文章都沒辦法讀。
如上所述,既然同步通信在使用中會造成如此嚴重的問題,JavaScript就把異步通信作為一條基本原則。因此,我們可以基于異步通信改寫上面的程序。 JavaScript要求以一種事件驅(qū)動的程序設(shè)計方式來寫異步通信程序。在很多場合中,你都必須指定一個回調(diào)程序,一旦收到通信響應(yīng),這個函數(shù)就會被調(diào)用。例如,上面定義的getArticleWithCache()可以寫成這樣:
var cache = {};
function getArticleWithCache ( id, callback ) {
if ( !cache[id] ) {
callback(cache[id]);
} else {
getArticle(id, function( a ){
cache[id] = a;
callback(a);
});
}
}

相關(guān)文章

  • Bootstrap3學(xué)習(xí)筆記(二)之排版

    Bootstrap3學(xué)習(xí)筆記(二)之排版

    這篇文章主要介紹了Bootstrap3學(xué)習(xí)筆記(二)之排版的相關(guān)資料,非常具有參考價值,特此分享腳本之家平臺,供大家參考
    2016-05-05
  • JS判斷點是否在線段上的代碼

    JS判斷點是否在線段上的代碼

    這篇文章主要介紹了JS判斷點是否在線段上的相關(guān)資料,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • 分享一款超好用的JavaScript 打包壓縮工具

    分享一款超好用的JavaScript 打包壓縮工具

    這篇文章主要介紹了寫一個飛快的 JavaScript 打包壓縮工具,非常好用,本文給大家分享實現(xiàn)思路,需要的朋友可以參考下
    2020-04-04
  • JS基于for語句編寫的九九乘法表示例

    JS基于for語句編寫的九九乘法表示例

    這篇文章主要介紹了JS基于for語句編寫的九九乘法,涉及for語句循環(huán)輸出結(jié)合table表格布局實現(xiàn)九九乘法功能的相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • 用 javascript 實現(xiàn)的點擊復(fù)制代碼

    用 javascript 實現(xiàn)的點擊復(fù)制代碼

    用 javascript 實現(xiàn)的點擊復(fù)制代碼,需要的朋友可以參考一下
    2007-03-03
  • 用js+xml自動生成表格的東西

    用js+xml自動生成表格的東西

    用js+xml自動生成表格的東西...
    2006-12-12
  • 為什么說JavaScript預(yù)解釋是一種毫無節(jié)操的機制詳析

    為什么說JavaScript預(yù)解釋是一種毫無節(jié)操的機制詳析

    這篇文章主要給大家介紹了關(guān)于為什么說JavaScript預(yù)解釋是一種毫無節(jié)操的機制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧
    2018-11-11
  • uniapp導(dǎo)航欄組件使用步驟

    uniapp導(dǎo)航欄組件使用步驟

    在uni-app中,可以使用官方提供的uni-navigator組件來實現(xiàn)導(dǎo)航欄的功能,這篇文章主要介紹了uniapp導(dǎo)航欄組件如何使用,需要的朋友可以參考下
    2024-01-01
  • JavaScript數(shù)組操作函數(shù)匯總

    JavaScript數(shù)組操作函數(shù)匯總

    這篇文章主要針對JavaScript數(shù)組操作函數(shù)push,pop,join,shift,unshift,slice,splice,concat進行總結(jié),感興趣的小伙伴們可以參考一下
    2016-08-08
  • echarts提示框tooltip被遮擋的解決辦法分享

    echarts提示框tooltip被遮擋的解決辦法分享

    這篇文章主要給大家介紹了關(guān)于echarts提示框tooltip被遮擋的解決辦法, 在制作圖表中,發(fā)現(xiàn)有時候tooltip會被線條遮擋或者被柱子折線遮擋,這種情況會偶爾出現(xiàn),需要的朋友可以參考下
    2023-08-08

最新評論