JavaScriptでマルチスレッドを模倣したマルチスレッドJavaScriptで (あれば)の場合、ボールを投げるに行く"ときている可能性が積極的にイベント駆動型アーキテクチャ犬を求めるようなものですが、ねえ、いつ?"疑似スレッドのアーキテクチャのタイムアウトを使用して実装されます。疑似スレッドの周期関数またはオブジェクトの呼び出しの結果であり、完全な実装では、次のソースコードで表示されます。 ソース: /クライアント/スクリプト/ jaxson / common.js ThreadObject()(this.obj = nullの機能; this.data =がnull; this.intervalId =がnull; = falseをthis.isUsed;)ThreadObject.prototype.makeCall =関数()(場合は((this.obj)=="関数")(this.obj(this.data)typeof演算;)他の場合は((this.obj)=="オブジェクト")typeof演算(this.obj.run(this.data );))ヴァールスレッド=(threadObjects:新しいArray()、startThread:(ヴァールc1 = 0; c1"this.threadObjects.length;用(objをデータ時間)(関数c1 + +)(場合に(!この。threadObjects [c1]。isUsed)(this.threadObjects [c1] = trueをisUsed; this.threadObjects [c1]データ=データ; this.threadObjects [c1]の。obj = OBJの; this.threadObjects [c1]。intervalId = window.setInterval("Thread.threadObjects ["+ c1 +"]。makeCall()"、時間)に戻りthis.threadObjects [c1]。intervalId;)))新しいエラーをスローする("")は、スレッドを開始できませんでした; )、endThread:関数()((ヴァールc1 = 0; c1"this.threadObjects.length;のintervalId c1 + +)(場合(this.threadObjects [c1] == intervalId intervalId)(()intervalId window.clearInterval ; this.threadObjects [c1] = falseをisUsed;))))関数InitializeThreads(ヴァールc1 = 0; c1"MaxThreadsは;用(MaxThreadsは)(c1 + +)(Thread.threadObjects.push(新しいThreadObject()); ))InitializeThreads(30); ソースでは、2つのオブジェクトタイプが定義されます:ThreadObjectとThread。 ThreadObjectタイプ模擬スレッドを管理するために使用され、スレッドはモックアップのスレッドを管理します。 InitializeThreads関数は、擬似環境のスレッドをセットアップするために使用されます。このソースコードでは、トップダウンのアプローチを説明するために使用されます。 ときには、JavaScriptファイルには、擬似を含むスレッドのアーキテクチャ読み込まれると、InitializeThreads関数30のパラメータの値で呼び出されます。 InitializeThreads擬似配列のスレッドが呼び出される初期化するために使用されます。ハード30のスレッドを制限するためのコーディングが悪いのプログラミングの練習のように見えるかもしれませんが、それには理由がある。擬似を作成するスレッドは、あなたがいずれかのwindow.setIntervalまたは使用する必要があることを意味する定期的なイベントを作成するwindow.setTimeoutはメソッドです。いずれのメソッドを呼び出すと、関数のリファレンスやJavaScriptのコードの部分が必要です。両方のアプローチの問題は、ソースコードをシリアル化する必要があります。たとえば、いずれかの定期的なイベントメソッドのローカルオブジェクト参照工大を呼び出すには、次のソースコードで説明する想像: window.setInterval("CallFunction(大)"、300);
というのは、周期的なタイマーを実行するを参照する文字列バッファには意味がないが、ローカル変数のコンテキスト内にない大する。実行するとエラーになります。関数をコールするもう一つの方法は、バッファに工大をシリアル化することですが、それは、これがあれば変更されているの欠点は、状態の定期的なイベントでは、同じオブジェクトのインスタンスをされません使用されている場合工大グローバル変数は関数setIntervalのタイマーの有効期限の呼び出しの間に、それらが存在することはできません。のみ時工大有効です。親指の一般的なルールは、コンテキスト固有のメソッドをするために、安全な方法として、メソッドをsetIntervalやsetTimeoutを使用して呼び出し、グローバル参照を使用することです。グローバル参照を動的にランダムな変数をインスタンス化するか、配列のインデックス参照を使用することによって作成することができます。このアプローチはスレッドによって選択された配列のインデックスです。InitializeThreads関数ThreadObject 30グローバル参照を初期化します。各ThreadObject 4つのデータメンバがあります: •OBJの:を実行するオブジェクトの参照。 ThreadObject.makeCallメソッドを関数とオブジェクトを区別することができます。 objが関数である場合、objは関数表記を使用して呼び出されます。 objがオブジェクトのインスタンスを、そのobj.runメソッドが呼び出されます。 •データ:参考文献のデータコンテキストがOBJのが実行されるとして使われます。 •intervalId:値を参照しますwindow.setIntervalメソッドによって返されます。この値は、定期的にイベントを停止するために使用されます。 •isUsed:スレッドによって使用されるかどうかを配列のインデックスは現在使用されて決定する。新しいスレッドは、空のインデックスを、ここでisUsedのstartThreadメソッドの検索を開始しようとfalseの値と等しい。いったんスレッドが開始されており、isUsedデータメンバがtrueの値が割り当てられている。時のスレッドの実行が完了したら、isUsedデータメンバをfalseに再度の値が割り当てられている。疑似スレッドアーキテクチャDynamicIteratorの宣言では、メタデータナビゲーションonmouseoverとonmouseoutイベントによって参照されます。するときは、HTMLページの1つの領域から別にし、マウスの動きは、他の地域のonmouseoverイベントを実施して、イベントがトリガされます。 onmouseoverイベントは、最初の時間がトリガされるイベントの上にマウスを移動すると呼ばれるようにstartIterationメソッドが、呼び出しThread.startThread。マウスは、メタデータのナビゲーション領域の外に移動すると、StopIterationをメソッドThread.endThread呼び出しと呼ばれます。 startIterationの実装とStopIterationをとして定義される次のとおり。 ソース: /クライアント/スクリプト/ jaxson / uimorphing.js (DynamicIterator)intervalId:0、startIteration:(方向)(this.intervalId = Thread.startThread(関数()(DynamicIterator.shiftArrayElements(direc)指向;)、方向、500)機能;)、StopIterationを:関数()(Thread.endThread( this.intervalId);) 一緒にクライアントの残りの作品置く 私は、結果のメタデータをナビゲートするために使用されているDynamicIterator実装は、参照されてきたいくつかの時間を設定します。 DynamicIteratorの主な役割は、メタデータは、ナビゲーション要素をロードするとされたときに、個々の要素は、メインのデータが読み込まれ参照されます。私は、ナビゲーション要素の初期化は、以下の表現とバラバラにDynamicIteratorの実装について説明します。 ソース: /クライアント/スクリプト/ DynamicIterator =(/ uimorphing.jsヴァールlastElem jaxson:nullのfloatingIframe:nullのparentRow:nullの初期化:(floatingIframeID、parentRowID)(this.floatingIframe =(floatingIframeID); this.parentRow = Document.getElementByIdにて関数Document.getElementByIdにて(parentRowID); this.doLayout(); this.getMoreRootElements(0);)、doLayout: - 4; this.floatingIframe.style()(this.floatingIframe.style.width = document.body.clientWidth関数です。高さ= document.body.clientHeight - 104;)、/ /他の宣言...);
バック"は、HTMLクライアント"のセクションを実装するには、ローカルの初期化関数が呼び出されるbody.onloadイベントは、実装のHTMLコードの部分のリコールの先頭に行く。初期化の実装では、DynamicIterator.initializeメソッドが呼び出されます。 DynamicIterator.initialize交差させる参照DynamicIteratorインスタンスを使用してHTMLのユーザーインターフェイス要素を呼び出す。 DynamicIterator.initialize 2つのHTMLユーザーインターフェイス要素:浮動iframeを(this.floatingIframe)と、テーブルの行には、ナビゲーション要素に含まれています(this.parentRow)見込んでいる。 DynamicIterator、これらの2つのユーザーインターフェイス要素のため、データを読み込みますナビゲーション領域で強調表示が必要です。後に、ユーザーインターフェイス要素のデータメンバに割り当てられているdoLayoutメソッドが呼び出されます。 doLayoutの目的は、それが適切なクライアント領域をカバーこれは、iframeのサイズを変更することです。とDynamicIterator.initializeでの最後のメソッド呼び出しは、メタデータは、ナビゲーション要素のロードを担当されているgetMoreRootElementsメソッドの呼び出しです。DynamicIteratorのコンテキストでは、getMoreRootElementsメソッドは、空の関数は次のように宣言されます: getMoreRootElements:(方向)関数は、() 空の関数のプレースホルダであり、それは、HTMLコードの実装を宣言することが期待されます。 HTMLコードの例では、getMoreRootElementsとして定義される次のとおり。 ソース: /クライアント/ ajaxrest記事/建築/ dynamiclist.html DynamicIterator.getMoreRootElements =関数(方向)(場合(方向== 0)(ヴァール非同期= FactoryHttp.getCachedAsynchronous(); asynchronous.settings =(onComplete:(XMLHTTPを)(VAR関数arrTickers =新しいArray();ヴァールティッカー= JSON.parse()xmlhttp.responseText;(ヴァールc1 = 0; c1"tickers.length; c1 + +)(arrTickers.push((テキスト:ティッカー[c1]のURL :"/ pyservices /トレーダー/歴史/テロップ/"+ティッカー[c1]));)DynamicIterator.associateElements(arrTickers);))asynchronous.get("/ pyservices /トレーダー/歴史/ティッカー");)) HTMLコードの例では、ティッカーは、一度だけロードされているメタデータは、アプリケーションをナビゲートするために使用表しています。メタデータには、しかし、無限の可能性があります多くの場合、固定セットのサイズに制限することができます場合でも、セットのサイズが非常に大きい。例を見てみると、メタデータの各部分は、1から4までの文字(平均)を持つことができるティッカーです。もし1000ティッカーで、その後、4KBの情報をダウンロードするが、その数倍5キロバイトのデータのブロードバンドのこの時代(の、ダウンロード、4KBの- 5KB)平成簡単です。在庫あり、アプリケーション50のティッカーで最も技術的な限界のためで、したがって、すべてのテロップの1つのリクエストでダウンロードすることができるようになる。 我々の例の場合では、0手段の方向性とメタデータ要素の最初のセットをダウンロードするgetMoreRootElements。どのようにデータをダウンロードされているgetMoreRootElementsの実装の責任です。この例では、非同期のクラスを使用して応答をJSONの配列としてエンコードされます。すべての銘柄については、オブジェクトがティッカーのURLを組み合わせて作成され、arrTickers配列に追加するデータが見つかりました。arrTickers配列の要素と同様に呼び出されると、DynamicIterator。associateElements方法を記入されている一次。 ソース: /クライアント/スクリプト/ jaxson / uimorphing.js (DynamicIterator)associateElements:(arrElements)(this.arrElements = arrElements; this.shiftArrayElements(0);)、関数 associateElementsメソッドは2つのことを行います:arrElementsの参照の配列を割り当て、HTMLページ内のデータはshiftArrayElementsメソッドを使用してリフレッシュする場合は、ユーザーのいずれかの左または右矢印の上に左または右に、ティッカーのリストをシフトマウスが残る。 インデックスの動きshiftArrayElementsメソッド内に含まれています。メソッドの呼び出し元のシフトは正または負の値を使用しての方向性を提供します。方向の値に基づいて、インデックスをシフトされます。場合は、シフトのインデックスが配列の境界を越えて、その後多くのメタデータの要素を取得することが必要だ。shiftArrayElementsの完全な実装を次のとおりです。 ソース: /クライアント/スクリプト/ jaxson / uimorphing.js (DynamicIterator)shiftArrayElements:()(this.currOffset = this.currOffset +オフセット;場合(this.currOffset"0)(this.getMoreRootElements(-1オフセット); = 0 this.currOffset;)他の場合は((this.currOffset +この関数は。parentRow.cells.length)"=)(this.getMoreRootElements(1); = - this.parentRow.cells.length;)(ヴァールカウンタ= 1; this.arrElements.length this.currOffset this.arrElements.lengthカウンタ"(this.parentRow.cells.length - 1);カウンタ+ +)(this.parentRow.cells [カウンタ]。innerHTML = this.arrElements [this.currOffset +カウンタ- 1]。テキスト; this.parentRow.cells [カウンタ]。refElemInfo = this.arrElements [this.currOffset +カウンタ- 1];)) 場合は、シフト配列の境界を越えてジャンプする原因となりますshiftArrayElementsの実装では、シフトの計算で決定するためにテストする必要があります。場合は、左または配列の境界線の右側に発生し、getMoreRootElementsメソッドへのジャンプと呼ばれ、ここで、-1または1は、配列の先頭または追加するメタデータは、配列の末尾にデータのプレフィックスを指定する方向の値は、それぞれの場合にシフトし、個別のHTMLユーザの要素を新たな参照情報をrefElemInfoプロパティに添付して再描画されている配列の境界を越えてジャンプは発生しません。これは個々のHTMLユーザーインターフェイス要素への独自のデータを添付するが、慣習的ではありませんが絶対に必要なユーザーが要素上でマウスをホバリングとは何の理由がありますこの場合はインチ 場合は、ユーザーがティッカー上にマウスを乗せ場合は、浮動小数点iframeをウィンドウにロードされるティッカー情報が欲しい。これは、のように定義されているDynamicIterator.HightlightItemメソッドによって達成される次のとおり。 ソース: /クライアント/スクリプト/ jaxson / uimorphing.js (DynamicIterator)highlightItem:(elemを)(場合(this.lastElem!=がnull)((this.lastElem)this.shrinkElement;)this.expandElement(elemを); this.lastElem = elemを、(elem.refElemInfo)this.fetch;)関数、 highlightItem以上のshrinkElement、expandElementに実行するアクションのデリゲートは、何もしないとメソッドをフェッチします。これらすべてのメソッドは、デフォルトでは、HTMLページを実装する必要がある、空の関数です。 highlightItemのアイデアクリックレスナビゲーションスキームを提供することです。どのようにナビゲーション機能は、HTMLページの責任であること。DynamicIteratorの責任の調整がありますので、最初のステップに戻るには、shrinkElementメソッドを使用して強調表示された最後の要素は、通常のサイズに変更することです。ティッカーの例の場合には、それは実装されて次のとおり。 ソース: /クライアント/ ajaxrest記事/建築/ dynamiclist.html DynamicIterator.shrinkElement =関数(elemを)(= 12 elem.style.fontSize;) ティッカー実装は、12日まで、表のセルに戻るのフォントを縮小するのは簡単です。アモーレ高度なユーザーインターフェイスでは、収縮要素には、メニュー、またはポップアップを開くdiv要素の終了を意味があります。highlightItemの次のステップを強調することです現在の要素をどのように実装されているexpandElement関数を使用します。 ソース: /クライアント/ ajaxrest記事/建築/ dynamiclist.html DynamicIterator.expandElement =関数(elemを)(= 30 elem.style.fontSize;ヴァール非同期= FactoryHttp.getCachedAsynchronous(); asynchronous.settings =(onComplete:(XMLHTTPの)関数は、() )asynchronous.get(elem.refElemInfo.url);) expandElement実装の2つの場合:フォント、ダウンロードのサイズが増加するデータのメタデータ要素に関連付けられます。これするときには、メタデータ要素を強調ただし、onCompleteの実装では、存在しないアクションの場合、おそらく、データの表示に興味はないが、すばやく実行将来の参照用のデータをキャッシュすることに興味を持っています。この時点では、iframe内にデータを表示するメカニズムについての決断を下す必要がある場合は、データをクリックして使用して表示したい場合、個々のテーブルのセルの場合はonclickを実装する必要があります。場合は、データを表示するトリガとして強調表示された場合は、私だけで実装する必要はないonCompleteメソッドを実装するために必要な行為をして使用するようにします。私が言いたいのは、データの表示方法はあなた次第です、およびDynamicIteratorないフレームワークを定義します。 DynamicIteratorデータのみをプリロードのために責任があります。一部の読者は、メタデータの要素が強調表示されているデータを取得するたびに思うことは非常に高価ですが、コストをどのようにあなたのキャッシュが実装に依存します。このことを意味するたびに非同期、まず最初に参照されて詳細については、キャッシュにチェックしていません。もし情報がすでに利用可能です、onCompleteメソッドを直接呼び出されます。魔法のキャッシュでは、と嘘がない場合は、キャッシュされ、そのたびに、メタデータ要素は、データリソースに関連付けられてロードされる強調表示されます。 レッツステップバックし、クライアントの実装側のアーキテクチャを考えるとどのように大規模なまたは低速なデータセットの我々の問題を解決します。もし我々の電子メールアプリケーションと、そのメタデータは、個々のメールのタイトルになる作業していた、我々のタイトルを反復すると、それらを強調表示します。新しいメールをチェックするために、我々は、自動的にarrElements配列の末尾に、メタデータ要素を追加します。スレッドスピンオフすることができます。として、我々は電子メールを超えるタイトルを繰り返し、彼らのコンテンツがダウンロードされるとは、iframeウィンドウに表示され、今の我々のすべての素数の計算され、結果を表示したいとしましょう。このケースでは、メタデータのデータ、およびされている電子メールアプリケーションのように、スレッドarrElements配列に結果を追加するように分社化されるだろう。私がこれまでの例をスピンオフされてスレッドのこれら2つの例を述べただけを示しています拡大とデータの読み込み時に、ユーザーがそれを要求する。 JavaScriptのスレッドを使用すると、データが自動的にそれを求めるユーザーせずにロードされます。 記事は、ソニアLandeを提出 免責事項:弊社のウェブサイトは、この資料の内容については責任を負いません。 Webarticles無料の情報リソースです。 重要: この記事は、"JavaScriptでマルチスレッドの"自動ソフトウェアによって翻訳された。大変申し訳ございませんが発生した可能性があります任意のスペルミスを感じている。お客様のご理解いただき、ありがとうございます。
|
|||||
| Online: 266 users browsing the articles directory |
|
|