2017-12-01 14 views
0

私はノードのjs関数にSQLプロシージャを変換しています。ノードjs、リファクタリング長いノードjsync関数

変換機能が長すぎるため、読みやすくなります。

小さな機能を分割したいのですが、どのようにリファクタリングできるのか分かりません。 いくつかのSQL文をシリアルで実行する必要があるため、async.waitを使用します。

exports.cancelDansok = function cancelDansok(dansokSeqNo, callback) { 
     var tasks = [ 
     function (callback) { 
      models.DansokHist.max('SerialNo', { 
      where: { DansokSeqNo: dansokSeqNo} 
      }) 
      .then(max => { 
      if (!max) { 
       callback(null, 1); 
      } else { 
       callback(null, max+1); 
      } 
      }) 
      .error(err => { 
      log.info(err); 
      return callback({status:400, message:'select dansokhisttbl failed.'}); 
      });   
     }, 
     function (serialNo, callback) { 
      .... 
      }) 
      .then(() => { 
      .... 
      }) 
      .then(feeVBankList => { 
      callback(null); 
      }) 
      .error(err => { 
      return callback({status:400, message:'update dansokfeetbl failed.'}); 
      });   
     }, 
     function (callback) {   
      .... 
     }, 
     function (callback) {   
      .... 
     }, 
     function (callback) {   
      .... 
     }, 
     function (callback) {   
      .... 
     } 
     ]; 

     async.waterfall(tasks, function(err, success) { 
     if (err) { 
      return callback(err); 
     } else { 
      return callback(success); 
     } 
     }); 
    } 

私の場合、どのようなベストプラクティスですか?

答えて

1

function (callback) {の名前付き関数を作成し、タスク配列で新しく作成した関数名で置き換えます。

さらに、コールバック関数をPromisesにラップし、Promise.allを使用します。

例:

/** 
    * I love cats! 
    */ 
    function loveCats() { 
    return new Promise((resolve, reject) => { 
     models.DansokHist.max('SerialNo', { 
     where: { DansokSeqNo: dansokSeqNo } 
     }) 
     .then(max => resolve(!max ? 1 : max + 1)) 
     .error(err => reject({ 
      status: 400, 
      message: 'select dansokhisttbl failed.', 
     })); 
    }); 
    } 

    /** 
    * I love dogs! 
    */ 
    function loveDogs() { 
    // ... 
    } 

    Promise.all([ 
    loveCats, 
    loveDogs, 
    ... 
    ]) 
    .then((allRets) => { 
    // Handle the rets 
    }) 
    .catch((err) => { 
    // Handle the errors 
    }); 

さらに良いことに、あなたが新しいサポート機能async/awaitを使用することができます。

/** 
    * I love cats! 
    */ 
    function loveCats() { 
    return new Promise((resolve, reject) => { 
     models.DansokHist.max('SerialNo', { 
     where: { DansokSeqNo: dansokSeqNo } 
     }) 
     .then(max => resolve(!max ? 1 : max + 1)) 
     .error(err => reject({ 
      status: 400, 
      message: 'select dansokhisttbl failed.', 
     })); 
    }); 
    } 

    /** 
    * I love dogs! 
    */ 
    function loveDogs() { 
    // ... 
    } 

    try { 
    const allRets = await Promise.all([ 
     loveCats, 
     loveDogs, 
     ... 
    ]); 

    // Handle the rets 
    } catch (err) { 
    // Handle the errors 
    }