节点js,重构长节点js异步函数

时间:2017-12-01 09:28:02

标签: node.js refactoring sequelize.js async.js

我将SQL过程转换为节点js函数。

我的转换功能太长,可读性差。

我想拆分小功能,但不知道如何重构它。 我使用async.wait,因为几个SQL语句应该是串行运行的。

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 个答案:

答案 0 :(得分:1)

我将为每个function (callback) {创建一个命名函数,然后通过新创建的函数名称在tasks数组中替换它们。

另外,我将回调函数包装到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
  }