nodejs非同期とコールバック

3156 ワード

何が非同期ですか
例えば朝起きたら、口を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