仕事の都合上、Web ページ上にスクリプトを記述して、Web ページを通じてシステムにデータをバッチで送信する必要があります。そこで Greasemonkey プラグインを思いついて書き始めたところ、問題はスムーズに解決されました。しかし、脚本を要約して整理するとき、私はいつも自分自身にこう問いかけました。「もっとシンプルにできないだろうか?」
私の答えはもちろん「はい」です。
まず、データのバッチ送信に関する要件を確認します。システムに挿入するユーザー データのバッチがありますが、システム ライブラリのテーブル構造が決定的ではないため、挿入用の SQL ステートメントに変換できません。 。挿入するデータは 200 件近くあり、システムに手動で入力したとしても、おそらく 1 日かかります。プログラマーとしては、もちろんそんな愚かなことはしません、プログラムを使って解決する必要があります。このプログラミングプロセスには 1 日かかりました。手入力に比べて、このブログ記事からの副収入は絶対に費用対効果が高いです!
プログラミング プラットフォームを選択するのに時間はかかりませんでした。ブラウザはもちろん Firefox でした。スクリプトの作業プロセス:
スクリプトに挿入するデータを事前に保存します
マウスのクリックをシミュレートしてページ上に入力ウィンドウを開きます
入力ウィンドウにデータを入力し、クリックをシミュレートします「送信」ボタンをクリックして、システムに送信されたデータを送信します。
すべてのデータが処理されるまで順番にループします。
ここでの技術的な問題点は次のとおりです。
入力ウィンドウを開くには、ネットワークの状況に応じて不規則な時間待機する必要があります。
データをバックグラウンドに送信すると、次のデータに進む前に処理が完了するまで待つ必要があります。
私が初心者であれば、もちろん、次のようなアプリケーション ロジックを直接作成します。
for(var i = 0; i { 3: clickButtonForInputWindow();
waitInputWindow(); (dataArray[i] );
clickSubmitButton();
waitInputWindowClose();
}
「ロックなし」の要件を満たすために、次のようにスクリプトを変更できます:
setTimeout(clickButtonForInputWindow); 🎜>setTimeout(waitInputWindowClose );
}
実際、ブラウザがサポートできる非同期操作は setTimeout と setInterval だけです。これら 2 つの関数をよりエレガントに使用して非同期操作を実装するにはどうすればよいでしょうか?現在の単純な答えは、Lao Zhao の Wind.js です。この関数ライブラリを使用したことはありませんが、$await 呼び出しだけで、簡潔さに対する一貫した要件を満たしています。しかし、私のような単一ファイルのスクリプトの場合、インターネットから外部 js ライブラリをダウンロードすることは、非同期操作をサポートするコードをコピーすることほど速くも楽しくもないことは明らかです。
非同期について説明する前に、同期操作のいくつかの構造タイプを思い出してみましょう。
シーケンス: ステートメントが実行される順序です。
判定: 判定ステートメントです。
ループ: strict ジャンプ(goto)すべきですが、現代の言語の多くはgotoをキャンセルしています。ループは実際には、if と goto を組み合わせた複合構造である必要があります。
非同期操作の難しさは 2 つの場所にあります。
非同期の判断: 非同期状況での判断は、基本的に、条件が満たされていることを検出し、特定のアクションを実行することです。
非同期シーケンス: シーケンスの各ステップの後、制御が戻り、次のタイム スライスで次のステップが待機されます。難しいのは秩序を維持することです。特に、2 つの連続したアクションの間に非同期ループがある場合に顕著です。
非同期ループ: 各ループの後、制御がブラウザに返され、このループは実行が終了するまで継続します。
最も単純な実装は、もちろん非同期ループです。私の実装コードは次のとおりです。
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 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 を使用します。

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

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

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

メモ帳++7.3.1
使いやすく無料のコードエディター

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン
