ホームページ ウェブフロントエンド jsチュートリアル 非同期 javascript_javascript 手法の原理と実装手法の紹介

非同期 javascript_javascript 手法の原理と実装手法の紹介

May 16, 2016 pm 05:48 PM
原理 成し遂げる 非同期

仕事の都合上、Web ページ上にスクリプトを記述して、Web ページを通じてシステムにデータをバッチで送信する必要があります。そこで Greasemonkey プラグインを思いついて書き始めたところ、問題はスムーズに解決されました。しかし、脚本を要約して整理するとき、私はいつも自分自身にこう問いかけました。「もっとシンプルにできないだろうか?」
私の答えはもちろん「はい」です。

まず、データのバッチ送信に関する要件を確認します。システムに挿入するユーザー データのバッチがありますが、システム ライブラリのテーブル構造が決定的ではないため、挿入用の SQL ステートメントに変換できません。 。挿入するデータは 200 件近くあり、システムに手動で入力したとしても、おそらく 1 日かかります。プログラマーとしては、もちろんそんな愚かなことはしません、プログラムを使って解決する必要があります。このプログラミングプロセスには 1 日かかりました。手入力に比べて、このブログ記事からの副収入は絶対に費用対効果が高いです!

プログラミング プラットフォームを選択するのに時間はかかりませんでした。ブラウザはもちろん Firefox でした。スクリプトの作業プロセス:
スクリプトに挿入するデータを事前に保存します
マウスのクリックをシミュレートしてページ上に入力ウィンドウを開きます
入力ウィンドウにデータを入力し、クリックをシミュレートします「送信」ボタンをクリックして、システムに送信されたデータを送信します。
すべてのデータが処理されるまで順番にループします。

ここでの技術的な問題点は次のとおりです。
入力ウィンドウを開くには、ネットワークの状況に応じて不規則な時間待機する必要があります。
データをバックグラウンドに送信すると、次のデータに進む前に処理が完了するまで待つ必要があります。
私が初心者であれば、もちろん、次のようなアプリケーション ロジックを直接作成します。

コードをコピー コードは次のとおりです:

for(var i = 0; i < dataArray.length; i)
{ 3: clickButtonForInputWindow();
waitInputWindow(); (dataArray[i] );
clickSubmitButton();
waitInputWindowClose();
}

実際には、数分後にすべてのブラウザが表示されます。 「応答なし」と表示され強制終了されました。その理由は、ブラウザが JavaScript を呼び出すと、CPU が実行のために js に渡され、インターフェイス メッセージを処理する時間がなくなるため、メイン インターフェイスが応答を停止するためです。

「ロックなし」の要件を満たすために、次のようにスクリプトを変更できます:

コードをコピー コードは次のとおりです:
for(var i = 0; i < dataArray.length; i)
{
setTimeout(clickButtonForInputWindow); 🎜>setTimeout(waitInputWindowClose );
}


実際、ブラウザがサポートできる非同期操作は setTimeout と setInterval だけです。これら 2 つの関数をよりエレガントに使用して非同期操作を実装するにはどうすればよいでしょうか?現在の単純な答えは、Lao Zhao の Wind.js です。この関数ライブラリを使用したことはありませんが、$await 呼び出しだけで、簡潔さに対する一貫した要件を満たしています。しかし、私のような単一ファイルのスクリプトの場合、インターネットから外部 js ライブラリをダウンロードすることは、非同期操作をサポートするコードをコピーすることほど速くも楽しくもないことは明らかです。
そこで、別の方法を見つけて、コンパイルが不要で、より使いやすく、コピー&ペーストで使える非同期関数ライブラリを作成することにしました。

非同期について説明する前に、同期操作のいくつかの構造タイプを思い出してみましょう。

シーケンス: ステートメントが実行される順序です。
判定: 判定ステートメントです。
ループ: strict ジャンプ(goto)すべきですが、現代の言語の多くはgotoをキャンセルしています。ループは実際には、if と goto を組み合わせた複合構造である必要があります。
非同期操作の難しさは 2 つの場所にあります。

非同期の判断: 非同期状況での判断は、基本的に、条件が満たされていることを検出し、特定のアクションを実行することです。
非同期シーケンス: シーケンスの各ステップの後、制御が戻り、次のタイム スライスで次のステップが待機されます。難しいのは秩序を維持することです。特に、2 つの連続したアクションの間に非同期ループがある場合に顕著です。
非同期ループ: 各ループの後、制御がブラウザに返され、このループは実行が終了するまで継続します。
最も単純な実装は、もちろん非同期ループです。私の実装コードは次のとおりです。



コードをコピーします コードは次のとおりです。 function asyncwhile(fn, interval)
{
if( fn == null || (typeof(fn) != "string" && typeof(fn) != "関数") )
return;
var ラッパー = function()
{
if( (typeof(fn) == "関数" ? fn() : eval(fn) ) != = false )
setTimeout(wrapper, 間隔 == null? 1: 間隔)
}
wrapper();
核心的な内容は次のとおりです: fn 関数の戻り値が false でない場合は、次の setTimeout 登録呼び出しを続行します。

実際、「待機して実行」ロジックは基本的に非同期ループの問題です。この状況を実装する方法の例は次のとおりです。
コードをコピー コードは次のとおりです:

asyncwhile(function (){
if( xxxCondition == false )
return true; // ループが継続することを示します
else
doSomeThing();
return false; / / ループを続行する必要がないことを示します
});

非待機ロジックと実行ロジックの場合、単純な setTimeout で十分です。
非同期は簡単ですが、非同期で注文を実装するのが難しいです。最初の理由は3ステップを実装したかったのですが、2番目の部分は100回を超える非同期ループでした。つまり、実装したい 3 ステップの操作は、実際には 103 個の連続した非同期操作です。ブラウザーで応答待機を実装する方法を見つけるために、頭の中で調べた結果、Firefox での実装しか見つかりませんでした。また、特権呼び出しを申請する必要がありました。
最後に、私は「実行チェーン」の概念を導入する簡単な方法を思いつきました。それは、同じ実行チェーンのすべての登録関数は逐次的であり、異なる実行チェーン間には関係がありません。また、相互排除(ミューテックス)などの概念はありません。同期したい場合はコード内で確認してください。
同じ実行チェーン内で実行トークンが保存され、トークンが関数のシリアル番号と一致した場合にのみ実行が許可され、非同期実行の順序が保証されます。
コードをコピーします コードは次のとおりです。

function asyncSeq(funcArray, chainName, abortWhenError)
{
if( typeof(funcArray) == "function" )
return asyncSeq([funcArray],chainName, abortWhenError);

if( funcArray == null || funcArray. length == 0 )
return;
if(chainName == null )chainName = "__default_seq_chain__"; var tInfo = tInfos[チェーン名] = tInfos[チェーン名] || {カウント : 0, currentIndex : -1, アボート : false};

for(var i = 0; i {
asyncwhile(function(item, tIndex){
return function(){
if( tInfo.abort )
return false;
if( tInfo.currentIndex < tIndex )
return true;
else if( tInfo.currentIndex == tIndex )
{
try{
item()
catch(e); 🎜>if ( abortWhenError ) tInfo.abort = true;
}
finally{
tInfo.currentIndex ;
}
else
{
if( abortWhenError ) tInfo.abort = true;
return false;
}

setTimeout( function() {
if( tInfo.count > 0 && tInfo.currentIndex == -1 )
tInfo.currentIndex = 0;
},20);が追加されました
}


これで、コピー&ペーストに対応した非同期js関数ライブラリが完成しました。具体的な使用例は次のとおりです。




コードをコピー

コードは次のとおりです。

function testAsync()
{
asyncSeq([function(){println("aSyncSeq -0 ");}
, function(){println("aSyncSeq -1 ") ;}
、function(){println("aSyncSeq -2 ");}
、function(){println("aSyncSeq -3 ");}
、function(){println("aSyncSeq -4 ");}
、function(){println("aSyncSeq -5 ");}
、function(){println("aSyncSeq -6 ");}
、function(){ println("aSyncSeq -7 ");}
、function(){println("aSyncSeq -8 ");}
、function(){println("aSyncSeq -9 ");}
、 function(){println("aSyncSeq -10 ");}
, function(){println("aSyncSeq -11 ");}
, function(){println("aSyncSeq -12 ");}
、function(){println("aSyncSeq -13 ");}
、function(){println("aSyncSeq -14 ");}
、function(){println("aSyncSeq -15 ");}
, function(){println("aSyncSeq -16 ");}
, function(){println("aSyncSeq -17 ");}
, function(){println( "aSyncSeq -18 ");}
, function(){println("aSyncSeq -19 ");}
, function(){println("aSyncSeq -20 ");}
, function( ){println("aSyncSeq -21 ");}
、function(){println("aSyncSeq -22 ");}
、function(){println("aSyncSeq -23 ");}
, function(){println("aSyncSeq -24 ");}
, function(){println("aSyncSeq -25 ");}
, function(){println("aSyncSeq -26 ") ;}
、function(){println("aSyncSeq -27 ");}
、function(){println("aSyncSeq -28 ");}
、function(){println("aSyncSeq -29 ");}
]);

asyncSeq([function(){println("aSyncSeq テストチェーン -a0 ");}
, function(){println("aSyncSeq テストチェーン -a1 ");}
、function(){println("aSyncSeq テストチェーン -a2 ");}
、function(){println("aSyncSeq テストチェーン -a3 ");}
、function(){println(" aSyncSeq テストチェーン -a4 ");}
, function(){println("aSyncSeq テストチェーン -a5 ");}
, function(){println("aSyncSeq テストチェーン -a6 ") ;}
, function(){println("aSyncSeq テストチェーン -a7 ");}
, function(){println("aSyncSeq テストチェーン -a8 ");}
], "テストチェーン");

asyncSeq([function(){println("aSyncSeq -a0 ");}
, function(){println("aSyncSeq -a1 ");}
, function(){println ("aSyncSeq -a2 ");}
, function(){println("aSyncSeq -a3 ");}
, function(){println("aSyncSeq -a4 ");}
, 関数(){println("aSyncSeq -a5 ");}
, function(){println("aSyncSeq -a6 ");}
, function(){println("aSyncSeq -a7 ");}
, function(){println("aSyncSeq -a8 ");}
]);
}

var textArea = null;

function println(text)
{
if( textArea == null )
{
textArea = document.getElementById("text");
textArea.value = "";
}

textArea.value = textArea.value text "rn";
}

最後に、要向大家说一声抱歉、很多只想拿代码的朋友恐怕要失望,如果你真的不知道怎么处処これら多余的行号,你可学界の次の表形式の代替案であり、UltraEdit を使用します。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Huawei 携帯電話にデュアル WeChat ログインを実装するにはどうすればよいですか? Huawei 携帯電話にデュアル WeChat ログインを実装するにはどうすればよいですか? Mar 24, 2024 am 11:27 AM

Huawei 携帯電話にデュアル WeChat ログインを実装するにはどうすればよいですか?ソーシャルメディアの台頭により、WeChatは人々の日常生活に欠かせないコミュニケーションツールの1つになりました。ただし、多くの人は、同じ携帯電話で同時に複数の WeChat アカウントにログインするという問題に遭遇する可能性があります。 Huawei 社の携帯電話ユーザーにとって、WeChat の二重ログインを実現することは難しくありませんが、この記事では Huawei 社の携帯電話で WeChat の二重ログインを実現する方法を紹介します。まず第一に、ファーウェイの携帯電話に付属するEMUIシステムは、デュアルアプリケーションを開くという非常に便利な機能を提供します。アプリケーションのデュアルオープン機能により、ユーザーは同時に

nohupの機能と原理の解析 nohupの機能と原理の解析 Mar 25, 2024 pm 03:24 PM

nohup の役割と原理の分析 Unix および Unix 系オペレーティング システムでは、nohup はバックグラウンドでコマンドを実行するためによく使用されるコマンドです。ユーザーが現在のセッションを終了したり、ターミナル ウィンドウを閉じたりしても、コマンドはまだ実行され続けています。この記事では、nohup コマンドの機能と原理を詳しく分析します。 1. nohup の役割: バックグラウンドでのコマンドの実行: nohup コマンドを使用すると、ターミナル セッションを終了するユーザーの影響を受けることなく、長時間実行されるコマンドをバックグラウンドで実行し続けることができます。これは実行する必要があります

PHP プログラミング ガイド: フィボナッチ数列を実装する方法 PHP プログラミング ガイド: フィボナッチ数列を実装する方法 Mar 20, 2024 pm 04:54 PM

プログラミング言語 PHP は、さまざまなプログラミング ロジックやアルゴリズムをサポートできる、Web 開発用の強力なツールです。その中でも、フィボナッチ数列の実装は、一般的で古典的なプログラミングの問題です。この記事では、PHP プログラミング言語を使用してフィボナッチ数列を実装する方法を、具体的なコード例を添付して紹介します。フィボナッチ数列は、次のように定義される数学的数列です。数列の最初と 2 番目の要素は 1 で、3 番目の要素以降、各要素の値は前の 2 つの要素の合計に等しくなります。シーケンスの最初のいくつかの要素

Huawei携帯電話にWeChatクローン機能を実装する方法 Huawei携帯電話にWeChatクローン機能を実装する方法 Mar 24, 2024 pm 06:03 PM

Huawei 携帯電話に WeChat クローン機能を実装する方法 ソーシャル ソフトウェアの人気と人々のプライバシーとセキュリティの重視に伴い、WeChat クローン機能は徐々に人々の注目を集めるようになりました。 WeChat クローン機能を使用すると、ユーザーは同じ携帯電話で複数の WeChat アカウントに同時にログインできるため、管理と使用が容易になります。 Huawei携帯電話にWeChatクローン機能を実装するのは難しくなく、次の手順に従うだけです。ステップ 1: 携帯電話システムのバージョンと WeChat のバージョンが要件を満たしていることを確認する まず、Huawei 携帯電話システムのバージョンと WeChat アプリが最新バージョンに更新されていることを確認します。

Golang がゲーム開発の可能性を可能にする方法をマスターする Golang がゲーム開発の可能性を可能にする方法をマスターする Mar 16, 2024 pm 12:57 PM

今日のソフトウェア開発分野では、効率的で簡潔かつ同時実行性の高いプログラミング言語として、Golang (Go 言語) が開発者にますます好まれています。豊富な標準ライブラリと効率的な同時実行機能により、ゲーム開発の分野で注目を集めています。この記事では、ゲーム開発に Golang を使用する方法を検討し、具体的なコード例を通じてその強力な可能性を示します。 1. ゲーム開発における Golang の利点 Golang は静的型付け言語として、大規模なゲーム システムの構築に使用されます。

PHP ゲーム要件実装ガイド PHP ゲーム要件実装ガイド Mar 11, 2024 am 08:45 AM

PHP ゲーム要件実装ガイド インターネットの普及と発展に伴い、Web ゲーム市場の人気はますます高まっています。多くの開発者は、PHP 言語を使用して独自の Web ゲームを開発することを望んでおり、ゲーム要件の実装は重要なステップです。この記事では、PHP 言語を使用して一般的なゲーム要件を実装する方法を紹介し、具体的なコード例を示します。 1. ゲームキャラクターの作成 Web ゲームにおいて、ゲームキャラクターは非常に重要な要素です。ゲームキャラクターの名前、レベル、経験値などの属性を定義し、これらを操作するメソッドを提供する必要があります。

Python asyncio の上級ガイド: 初心者から専門家まで Python asyncio の上級ガイド: 初心者から専門家まで Mar 04, 2024 am 09:43 AM

同時プログラミングと非同期プログラミング 同時プログラミングは、同時に実行される複数のタスクを扱います。非同期プログラミングは、タスクがスレッドをブロックしない同時プログラミングの一種です。 asyncio は Python の非同期プログラミング用のライブラリで、プログラムがメイン スレッドをブロックせずに I/O 操作を実行できるようにします。イベント ループ asyncio の中核は、I/O イベントを監視し、対応するタスクをスケジュールするイベント ループです。コルーチンの準備が完了すると、イベント ループは I/O 操作を待つまでそのコルーチンを実行します。その後、コルーチンを一時停止し、他のコルーチンの実行を継続します。コルーチン コルーチンは、実行を一時停止および再開できる関数です。 asyncdef キーワードは、コルーチンの作成に使用されます。コルーチンは await キーワードを使用して、I/O 操作が完了するのを待ちます。 asyncio の次の基本

Astar ステーキングの原則、収入の解体、エアドロップ プロジェクトと戦略、および運営のナニー レベルの戦略 Astar ステーキングの原則、収入の解体、エアドロップ プロジェクトと戦略、および運営のナニー レベルの戦略 Jun 25, 2024 pm 07:09 PM

目次 Astar Dapp ステーキングの原則 ステーキング収益 潜在的なエアドロップ プロジェクトの解体: AlgemNeurolancheHealthreeAstar Degens DAOVeryLongSwap ステーキング戦略と運用 「AstarDapp ステーキング」は今年初めに V3 バージョンにアップグレードされ、ステーキング収益に多くの調整が加えられましたルール。現在、最初のステーキング サイクルが終了し、2 番目のステーキング サイクルの「投票」サブサイクルが始まったばかりです。 「追加報酬」特典を獲得するには、この重要な段階を把握する必要があります (6 月 26 日まで続く予定で、残りは 5 日未満です)。 Astarステーキング収入を詳しく説明します。

See all articles