nodejs非同期とコールバック
3156 ワード
何が非同期ですか
例えば朝起きたら、口を3 min洗って、水を3 min沸かして、牛乳を流して、この3つのことをする過程を分析します.もしお湯を沸かすなら、スイッチを押すだけでいいです.牛乳を入れる時間がないなら、ステップ:お湯を沸かして、口を洗ってください.
nodejsメカニズム
nodejsは単一スレッド言語で、すべてのイベントは一つのスタックにおいて行われます.現在の関数スタックをクリアしないと、後ろのコードが実行されません.しかし、非同期ができないのではないですか?いいえ、例外があります.no dejsはio操作と一部のネットワーク要求に対して非同期的な操作を提供しました.次に以下の例を見ます.
同期例
非同期例
nodejsの長所と短所
例えば初期の白さんはこのようにコードを書きました.
コールバック
これは非常に不思議です.nodejsの多くの実現は基本的に非同期+コールバックです.では、どのようにコールバック関数を書きますか?JavaからAndroidに転向したプログラマーとして、Javaのコールバックの書き方を研究する時間がかかりました.例とその中のコメントを直接見ましょう.
例えば朝起きたら、口を3 min洗って、水を3 min沸かして、牛乳を流して、この3つのことをする過程を分析します.もしお湯を沸かすなら、スイッチを押すだけでいいです.牛乳を入れる時間がないなら、ステップ:お湯を沸かして、口を洗ってください.
nodejsメカニズム
nodejsは単一スレッド言語で、すべてのイベントは一つのスタックにおいて行われます.現在の関数スタックをクリアしないと、後ろのコードが実行されません.しかし、非同期ができないのではないですか?いいえ、例外があります.no dejsはio操作と一部のネットワーク要求に対して非同期的な操作を提供しました.次に以下の例を見ます.
同期例
function runSync() {
for (var i = 0; i < 5; i++) {
var waitUnit = new Date().getTime() + 1000;
while (waitUnit > new Date().getTime()) {
}
console.log('doing');
}
}
runSync();
console.log('end');
出力結果:doing
doing
doing
doing
doing
end
以上は一つの同期の例です.関数runSyncの実行が完了するまで、下記のロゴが実行されます.非同期例
var fs = require('fs')
function read_file(path){
fs.readFile(path,"UTF-8",function(err,data){
if(data){
resolve(data);
console.log('resolve');
}else{
reject(err);
console.log('reject');
}
});
}
read_file('/Users/jemy/Desktop/player_sdk2.1.5.zip');
console.log('end');
出力情報は以下の通りです.end
resolve
まずendを印刷しました.これはなぜですか?node内部のioはreadFileというイベントを補助スレッドにして、それを無視して、readFileは時間がかかる操作なので、先にロゴを印刷します.readFileがこれを使った時に操作が完了したら、再度実行が完了したことをお知らせします.nodejsの長所と短所
例えば初期の白さんはこのようにコードを書きました.
var name = '';
$.ajax({
...
success:function(data){name=data.name},
});
$("#name").html(name);
最後に、どうしてもhtmlにname値の欠点を書き込むことができないことを発見しました.1.シングルスレッドなので、一つのところに掛けました.全体gg 2.IO以外の複雑性計算には適用されません.誰かがそこであなたの帰りを待っています.1.業務量は小さいですが、IOの操作は頻繁に利用できます.高合併に適用されます.2.単線プログラムは渋滞しません.異歩のピットが多いです.例えば、上記のような初期のコードを書くと、バグが発生します.コールバック
これは非常に不思議です.nodejsの多くの実現は基本的に非同期+コールバックです.では、どのようにコールバック関数を書きますか?JavaからAndroidに転向したプログラマーとして、Javaのコールバックの書き方を研究する時間がかかりました.例とその中のコメントを直接見ましょう.
// --
function printAsTime(name,stop) {
for(var i = 0;i<5;i++){
var waitUnit = new Date().getTime()+1000;
while(waitUnit>new Date().getTime()){
}
console.log(name);//3.log
}
try {
var str = stop('arg1','arg2','arg3');//4.
console.log(str);//7.
} catch (err) {
console.log(' ');//
}
}
//
// function stopPrint(ret01,ret02,ret03){
// console.log('stop- '+ret01+'-'+ret02+'-'+ret03);
// }
// console.log('start-function');
// //printAsTime('zhangwei',stopPrint);
// printAsTime('zhangwei');
// console.log('stop-function');
//ES6
console.log('start-function'); //1.start
printAsTime('zhangwei',(ret01,ret02,ret03)=>{//2. printAsTime
console.log('stop- : '+ret01+'-'+ret02+'-'+ret03);//5.
return ' ';//6.
})
console.log('stop-function');//8.
結果は以下の通りですstart-function
zhangwei
zhangwei
zhangwei
zhangwei
zhangwei
stop- : arg1-arg2-arg3
stop-function