Nodejs非同期処理の進化

2810 ワード

****シーン****
Nodejsをバックグラウンドサーバ言語として使うと、多くの非同期I/O操作を処理します.例えば、私たちがmongodbにデータを変更したい場合、最初にchunk関数を使用して非同期I/O動作を実現します.
Chunck関数が非同期動作を実現します.
//        
Comment.prototype.save = function(callback) {
  var name = this.name,
      comment = this.comment;
  //     
  mongodb.open(function (err, db) {
    if (err) {
      return callback(err);
    }
    //   posts   
    db.collection('posts', function (err, collection) {
      if (err) {
        mongodb.close();
        return callback(err);
      }
      //     、         ,                comments    
      collection.update({
        "name": name,
      }, {
        $push: {"comments": comment}
      } , function (err) {
          mongodb.close();
          if (err) {
            return callback(err);
          }
          callback(null);
      });   
    });
  });
};

これは私たちが非難しているcalback hellです.読みにくいです.
Promise関数は非同期操作を実現する.
Promise関数はチェーン操作の特性とcatch exceptionの関数により、Chunk関数のcalback hellを回避することができます.しかし、それぞれの論理をそれぞれ異なるthen()関数にカプセル化する必要があります.それぞれの関数には独自の作用領域があります.ある定数または変数を共有する場合は、関数の外に定義する必要があります.Generator関数は、最初に非同期関数の同期化機能を実現しました.
var name = this.name,
    comment = this.comment;
mongoDb
    .open()
    .then(function(db){
      return db.collection("posts");
    })
    .then(function(collection){
      return collection.update({
            "name": name,
        }, {
            $push: {"comments": comment}
        });
    })
    .then(){
      mongodb.close();
    })
    .catch(function(e){
      throw new Error(e);
    })
Genetrator関数は非同期操作を実現します.
ES 6のGeneratorサブジェネレータを借りて、TJ大神はcoライブラリの最初の非同期プログラムの同期化を実現する機能を書き出しました.私たちはco(){}によって、関数内部をディケンサで制御することができます.coはここでスターターとして働いています.
var co = require("co");
var name = this.name,
    comment = this.comment;

co(function *(){
    var db, collection; 
    try{
        db = yield mongodb.open();
        collection = yield db.collection("posts");
        yield collection.update({
            "name": name,
        }, {
            $push: {"comments": comment}
        });
    }catch(e){
        console.log(e);
    }
     mongodb.close();
});
async/await関数は非同期操作を実現します.
ES 7のasync/awaitの出現は非同期関数操作を実現するための別の方法を提供しています.awaitキーワードの役割はgenerator関数のyieldと似ています.
var db, collection, result; 
async function UpateDB () {
    var name = this.name,
    comment = this.comment;
    try{
        db = await mongodb.open();
        collection = await db.collection("users");
        await collection.update({
                "name": name,
            }, {
                $push: {"comments": comment}
        });
    }catch(e){
        console.log(e);
    }
    mongodb.close();
}