Node js,重构长node js异步函数

Node js, refactoring long node js async function

我正在将 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);
         }
       });
     }

对我而言,最佳做法是什么?

我会为每个 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
  }