【问题标题】:Promise Chain Breaks w/ .all()Promise Chain Breaks w/.all()
【发布时间】:2017-04-12 20:44:06
【问题描述】:

我是相当新的承诺,并认为我对事情有所了解,但显然我没有。

以下代码用于获取 X 个表名 (getTableName()),将它们传递给 getData() 并遍历每个表以获取数据。然后我调用 Promise.all() 来解决这些问题,并尝试将数据传递到链中的下一个链接 (createFile()),但 Promise.all() 在继续到 createFile() 后解决。

这是“反模式”回来咬我的一个例子吗?如果是这样,您能否建议我应该如何重组以完成我打算做的事情?

谢谢!

exports.getRawDataForExport = function(data) {
  return new Promise(function(resolve, reject) {

    var getTableName = function() {
      return knex('monitored_parameter')
        .where('device_id', data.device_id)
        .whereIn('internal_name', data.param)
        .select()
        .then(function(rows) {
          if(rows) {
            var runningResult = {};
            for(var i = 0; i < rows.length; i++) {
              var tbl = {"table" : 'monitored_parameter_data_' + rows[i].id, "param" : rows[i].display_name};
              runningResult.table = [];
              runningResult.table.push(tbl);
            }

            return runningResult;

          } else {
            // if no MP row(s) found we cannot proceed
            throw new Error("No history found for that parameter.");
          }
        });
    }

    var getData = function(runningResult) {
      var promises = [];

      if(data.date_start && data.date_end) {
        // grab within range

        for(var i = 0; i < runningResult.table.length; i++) {
          promises.push(
            knexHistory(runningResult.table[i].table)
              .select('created', 'data_value as value', 'unit')
              .whereBetween('created', [data.date_start, data.date_end])
            );
        }

        // *** the chain moves on to createFile() before this data is passed along
        Promise.all(promises).then(function(data) {
          console.dir('inside promises.all');
          console.dir(data);
          runningResult.data = data;
          return runningResult;
        });

      } else {
        // grab all
        for(var i = 0; i < runningResult.table.length; i++) {
          promises.push(
            knexHistory(runningResult.table[i].table)
              .select('created', 'data_value as value', 'unit')
            );
        }

        // *** the chain moves on to createFile() before this data is passed along
        Promise.all(promises).then(function(data) {
          console.dir('inside promises.all');
          console.dir(data);
          runningResult.data = data;
          return runningResult;
        });
      }
    }

    var createFile = function(runningResult) {

      var files = [],
          zipFileName = filePathExport + 'Data_Export.zip';

      for(var i = 0; i < runningResult.table.length; i++) {
        var fields = ['created', 'value', 'unit'],
            csvFileName = runningResult.param + '_export.csv',
            csvFilePath = filePathExport + runningResult.param + '_export.csv';

        var csv = json2csv({data : runningResult.data[i], fields : fields, doubleQuotes : ''});

        fs.writeFileSync(csvFilePath, csv);

        files.push(csvFilePath);
      }

      var zip = new admzip();

      for(var j = 0; j < files.length; j++) {
        var input = fs.readFileSync(files[i]);
        zip.addFile(csvFileName, input, '', 0644);
      }

      zip.writeZip(zipFileName);

      return zipFileName;

    }

    getTableName()
      .then(getData)
      .then(createFile)
      .then(function(zipFile) {
        resolve(zipFile);
      })
      .catch(function(err) {
        resolve(err);
      });

  });
}

【问题讨论】:

    标签: javascript node.js design-patterns promise knex.js


    【解决方案1】:

    您需要将Promise.all(...).then(...) 的结果return(在这两种情况下),以便getData 返回一个承诺。

    而且,是的,您使用的是promise constructor antipattern,尽管这不是问题的原因。

    删除 return new Promise(function(resolve, reject) { 包装器,然后像这样返回:

    return getTableName().then(getData)
    

    ...省略对resolve的调用

    【讨论】:

    • 感谢您的快速回复,这种方法效果很好。
    【解决方案2】:

    你可能只想return链接的Promise.all

    var getData = function(runningResult) {
          var promises = [];
    
          if(data.date_start && data.date_end) {
            // grab within range
    
            for(var i = 0; i < runningResult.table.length; i++) {
              promises.push(
                knexHistory(runningResult.table[i].table)
                  .select('created', 'data_value as value', 'unit')
                  .whereBetween('created', [data.date_start, data.date_end])
                );
            }
    
            // *** the chain moves on to createFile() before this data is passed along
            return Promise.all(promises).then(function(data) {
              console.dir('inside promises.all');
              console.dir(data);
              runningResult.data = data;
              return runningResult;
            });
    
          } else {
            // grab all
            for(var i = 0; i < runningResult.table.length; i++) {
              promises.push(
                knexHistory(runningResult.table[i].table)
                  .select('created', 'data_value as value', 'unit')
                );
            }
    
            // *** the chain moves on to createFile() before this data is passed along
            return Promise.all(promises).then(function(data) {
              console.dir('inside promises.all');
              console.dir(data);
              runningResult.data = data;
              return runningResult;
            });
          }
        }
    

    【讨论】:

      猜你喜欢
      • 2022-12-19
      • 2021-06-13
      • 2019-11-11
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2018-07-08
      相关资源
      最近更新 更多