javascriptはsleep関数を使うよくある方法を詳しく説明します。
6806 ワード
本論文の実例は、javascriptがsleep関数を使用する一般的な方法を述べている。皆さんに参考にしてあげます。具体的には以下の通りです。
一.sleep関数は何ですか?
sleep関数について時間をかけて話します。まず何がsleep関数ですか?
sleepは指定された時間をプログラムを一時停止させる機能で、遅延効果があります。
たとえば:
もちろん上のコードは実行できません。jsにsleepメソッドがないからです。
この文章は主にjsでsleepを実現する方法をいくつか紹介しています。
二.なぜsleepを使うのですか?
ここを見ていると、なぜsleepを使うのですか?上記の例はset Timeoutを使って実現できますか?
セットTimeoutはコールバック関数によってタイミングタスクを実現するので、マルチタスクのシーンではコールバックがネストされます。
次に、それぞれいくつかの異なる方法でsleep方法を実現します。
1.Dateによる実現
デッドサイクルによってコードの実行を停止し、タイムアウトを停止します。
以上のコードはスレッドをスリープさせるのではなく、高負荷計算によりcpuを他のタスクに対して処理する余裕がないようにします。
このようにする欠点は、sleepの過程で他のすべてのタスクが一時停止され、domのレンダリングを含む。
sleepの過程でプログラムは仮死状態になり、他のタスクを実行しません。
2.Promiseベースのsleep
ajaxのエコーネスト問題を解決するために、jQuery 1.8の後にPromiseをサポートしました。ただ単純なPromiseは、前の縦入れ子を横入れ子に変更しただけで、
最終結果は以下のコードです。
ES 6のGenerator関数を使って上記の例を書き換えます。
3.Generator関数に基づくsleep
sleepの実行はGenerator関数を用いて実行し,coを組み合わせて自己実行した。
コードを見る:
また、実行中に仮死が発生しないため、他のタスクの実行をブロックしません。
しかし、一つのcoアクチュエータの引用が多くなりましたので、まだ瑕疵があります。
もちろんこれは最終版ではありません。ES 7は私たちに新しい解決策をもたらしてくれました。
4.async関数に基づくsleep
ES 7にasync関数が追加されました。async関数の最大の特徴はアクチュエータを持参することです。だから、私達はcoを通してsleepを実現できます。
コードを見る:
5.child_を使うprocess(子プロセス)がsleep関数を実現する。
いくつかの比較的簡単なsleep実現を紹介しましたが、これからは難しい実現を見ます。
原理は、sleepをサブプロセスにおいて実行することであり、他のプロセスに影響を与えず、コードを見ることである。
同期中にタイマーを実行し、タイマーが実行したら回収プロセスを実行します。
6.npm sleepパッケージを使用する
前の内容は全部私達が自分で実現したものです。実はnpmにはすでに関連のjsカバンがたくさんあります。
彼らがどうやって実現したかを見に来ました。sleep。
いい選択です。
以上がsleepの6つの簡単な実現です。皆さん、問題を指摘してください。一緒に進歩します。
興味のある友達はオンラインHTML/CSS/JavaScriptコードを使ってツールを実行できます。http://tools.jb51.net/code/HtmlJsRun上記コードの運行効果をテストします。
もっと多くのJavaScriptに関する内容は当駅のテーマを調べられます。「JavaScript常用関数技術のまとめ」、「javascript対象向け入門教程」、「JavaScriptエラーとデバッグテクニックのまとめ」、「JavaScriptデータ構造とアルゴリズム技術のまとめ」及び「JavaScript数学演算の使い方のまとめ」
本論文で述べたように、JavaScriptプログラムの設計に役に立ちます。
一.sleep関数は何ですか?
sleep関数について時間をかけて話します。まず何がsleep関数ですか?
sleepは指定された時間をプログラムを一時停止させる機能で、遅延効果があります。
たとえば:
console.log('1');
sleep(5000);
console.log('2');
コンソールからデジタル1を出力すると5秒間隔で数字2を出力します。もちろん上のコードは実行できません。jsにsleepメソッドがないからです。
この文章は主にjsでsleepを実現する方法をいくつか紹介しています。
二.なぜsleepを使うのですか?
ここを見ていると、なぜsleepを使うのですか?上記の例はset Timeoutを使って実現できますか?
セットTimeoutはコールバック関数によってタイミングタスクを実現するので、マルチタスクのシーンではコールバックがネストされます。
console.time('runTime:');
setTimeout(function(){
console.log('1')
setTimeout(function(){
console.log('2');
setTimeout(function(){
console.log('3');
console.timeEnd('runTime:');
}, 2000);
}, 3000);
}, 2000);
// 1
// 2
// 3
// runTime:: 7013.104ms
上記の方法にはエコーネストの問題があります。優雅な方法で上記の例を実現したいです。
sleep(2000);
console.log('1');
sleep(3000);
console.log('2');
sleep(2000);
console.log('3');
...
三.sleepを実現する次に、それぞれいくつかの異なる方法でsleep方法を実現します。
1.Dateによる実現
デッドサイクルによってコードの実行を停止し、タイムアウトを停止します。
function sleep(time){
var timeStamp = new Date().getTime();
var endTime = timeStamp + time;
while(true){
if (new Date().getTime() > endTime){
return;
}
}
}
console.time('runTime:');
sleep(2000);
console.log('1');
sleep(3000);
console.log('2');
sleep(2000);
console.log('3');
console.timeEnd('runTime:');
// 1
// 2
// 3
// runTime:: 7004.301ms
短所:以上のコードはスレッドをスリープさせるのではなく、高負荷計算によりcpuを他のタスクに対して処理する余裕がないようにします。
このようにする欠点は、sleepの過程で他のすべてのタスクが一時停止され、domのレンダリングを含む。
sleepの過程でプログラムは仮死状態になり、他のタスクを実行しません。
2.Promiseベースのsleep
ajaxのエコーネスト問題を解決するために、jQuery 1.8の後にPromiseをサポートしました。ただ単純なPromiseは、前の縦入れ子を横入れ子に変更しただけで、
最終結果は以下のコードです。
function sleep(time){
return new Promise(function(resolve){
setTimeout(resolve, time);
});
}
console.time('runTime:');
console.log('1');
sleep(1000).then(function(){
console.log('2');
sleep(2000).then(function(){
console.log('3');
console.timeEnd('runTime:');
});
});
console.log('a');
// 1
// a
// 2
// 3
// runTime:: 3013.476ms
これは以前のsetTimeoutと入れ子の違いがなく、見苦しいです。ES 6のGenerator関数を使って上記の例を書き換えます。
3.Generator関数に基づくsleep
sleepの実行はGenerator関数を用いて実行し,coを組み合わせて自己実行した。
コードを見る:
var co = require('co');
function sleep(time){
return new Promise(function(resolve){
setTimeout(resolve, time);
});
}
var run = function* (){
console.time('runTime:');
console.log('1');
yield sleep(2000);
console.log('2');
yield sleep(1000);
console.log('3');
console.timeEnd('runTime:');
}
co(run);
console.log('a');
// 1
// a
// 2
// 3
// runTime:: 3004.935ms
全体のコードは入れ子の関係がないように見えますか?それとも楽ですか?また、実行中に仮死が発生しないため、他のタスクの実行をブロックしません。
しかし、一つのcoアクチュエータの引用が多くなりましたので、まだ瑕疵があります。
もちろんこれは最終版ではありません。ES 7は私たちに新しい解決策をもたらしてくれました。
4.async関数に基づくsleep
ES 7にasync関数が追加されました。async関数の最大の特徴はアクチュエータを持参することです。だから、私達はcoを通してsleepを実現できます。
コードを見る:
function sleep(time){
return new Promise((resolve) => setTimeout(resolve, time));
}
async function run(){
console.time('runTime:');
console.log('1');
await sleep(2000);
console.log('2');
await sleep(1000);
console.log('3');
console.timeEnd('runTime:');
}
run();
console.log('a');
// 1
// a
// 2
// 3
// runTime:: 3009.984ms
効果は前と同じです。5.child_を使うprocess(子プロセス)がsleep関数を実現する。
いくつかの比較的簡単なsleep実現を紹介しましたが、これからは難しい実現を見ます。
原理は、sleepをサブプロセスにおいて実行することであり、他のプロセスに影響を与えず、コードを見ることである。
var childProcess = require('child_process');
var nodeBin = process.argv[0];
function sleep(time) {
childProcess.execFileSync(nodeBin, ['-e', 'setTimeout(function() {}, ' + time + ');']);
// childProcess.spawnSync(nodeBin, ['-e', 'setTimeout(function() {}, ' + time + ');']);
}
console.time('runTime:');
console.log('1');
sleep(1000);
console.log('2');
sleep(2000);
console.log('3');
console.timeEnd('runTime:');
// 1
// 2
// 3
// runTime:: 3579.093ms
以上のコードは、childProcessオブジェクトのexecFileSyncまたはspawnSyncを通じて同期プロセスを作成し、同期中にタイマーを実行し、タイマーが実行したら回収プロセスを実行します。
6.npm sleepパッケージを使用する
前の内容は全部私達が自分で実現したものです。実はnpmにはすでに関連のjsカバンがたくさんあります。
彼らがどうやって実現したかを見に来ました。sleep。
var sleep = require('sleep');
console.log('1');
console.time('runTime:');
sleep.sleep(2); // 2
console.log('2');
sleep.msleep(1000); // 1000
console.log('3');
sleep.usleep(1000000) // 1000000 = 1
console.log('4');
console.timeEnd('runTime:');
// 1
// 2
// 3
// 4
// runTime:: 4014.455ms
強いのかどうか、sleepパッケージはC++で作成し、Nodeに拡張してsleep関数を実現します。いい選択です。
以上がsleepの6つの簡単な実現です。皆さん、問題を指摘してください。一緒に進歩します。
興味のある友達はオンラインHTML/CSS/JavaScriptコードを使ってツールを実行できます。http://tools.jb51.net/code/HtmlJsRun上記コードの運行効果をテストします。
もっと多くのJavaScriptに関する内容は当駅のテーマを調べられます。「JavaScript常用関数技術のまとめ」、「javascript対象向け入門教程」、「JavaScriptエラーとデバッグテクニックのまとめ」、「JavaScriptデータ構造とアルゴリズム技術のまとめ」及び「JavaScript数学演算の使い方のまとめ」
本論文で述べたように、JavaScriptプログラムの設計に役に立ちます。