Node-mysql非同期操作を実現(上)


Node-mysql非同期操作を実現する前に、JSでの非同期操作についてお話しします.ES 6でPromiseオブジェクトが提供されています
Promiseオブジェクトの3つの状態
  • pending(進行中)
  • fulfilled(成功)
  • rejected(失敗)
  • ステータスの変換または一方向不可逆プロセスpending->fulfilled pending->rejected
    きほんしよう
    Promise定義後、pending->fulfilledステータスとpending->rejectedステータスに対応するresolveとrejectの2つのパラメータがあります.
    //   
    const promise = new Promise(function(resolve, reject) {
      //        
      //     ,     
    
      if (/*        */){
        resolve(value);
      } else {
        reject(error);
      }
    });

    実行時、resolveを実行してもrejectを実行しても、返されるのはPromiseオブジェクトで、Promiseオブジェクトの値を取得するにはthenで取得します.thenには、Promiseオブジェクトのresolveパラメータとrejectパラメータに対応する2つの関数があります.
    //   
    promise.then(function(resolve){
        ...
    },function(reject){
        ...
    })

    シミュレーション非同期操作の例
    const timeout = (ms) => {
        return new Promise((resolve, reject) => {
            resolve('done job')
        });
    }
    
    console.log(timeout(100)) // Promise { 'done job' }
    
    timeout(100).then(res => {
        console.log(res) // done job
    })

    よく考えてみると、promiseオブジェクトのデータはthenからデータを得ることができますが、thenのようなチェーン呼び出しはコールバック地獄をもたらす可能性があります.同期関数のように操作してtimeout(100)に直接戻り値を持たせることができれば、もっといいです.ES 2017規格ではasync関数が導入されており、async関数ではpromiseオブジェクトの前にawaitでpromiseオブジェクトから直接データを取得することができます.
    上の例を修正する
    async関数で印刷された値はthenで印刷された値とそっくりです
    const timeout = (ms) => {
        return new Promise((resolve, reject) => {
            resolve('done job')
        });
    }
    
    console.log(timeout(100)) // Promise { 'done job' }
    
    timeout(100).then(res => {
        console.log(res) // done job
    })
    
    const getStr = async () => {
        const str = await timeout(100);
        console.log(str) // done job
    }
    
    getStr()