【问题标题】:node.js - Combining 2 Promisesnode.js - 结合 2 个 Promise
【发布时间】:2018-07-31 23:55:48
【问题描述】:

我必须创建一个文件上传,将文件存储在亚马逊 S3 存储桶中,然后将信息写入数据库。

  router.post('/report', upload.single('file'), function(req, res, next) {
    reportService
      .uploadReport(req.body, req.file)
      .then(data => {
        res.send(data);
      })
      .catch(err => {
        res.send(err);
      });
  });

这段代码处理调用。它触发以下代码。

function uploadReport(report, file) {
  var objectParams = { Bucket: bucketName, Key: file.filename, Body: '' };
  var fs = require('fs');
  var fileStream = fs.createReadStream(file.path);
  fileStream.on('error', function(err) {
    console.log('File Error', err);
  });
  objectParams.Body = fileStream;
  return new Promise((resolve, reject) => {
    s3.putObject(objectParams)
    .promise()
    .then(
      data => {
        resolve(this.addReport(report, data.Location)
          .then(response => resolve(response))
          .catch(err => {
            reject(err);
          })
        );
      },
      err => {
        reject(err);
      }
    );
  });
}

这段代码将文件上传到我的s3存储桶,上传完成后调用save report function写入数据库。

function addReport(report, url) {
  return new Promise((resolve, reject) => {
    reportModel
      .addReport(report, url)
      .then(report => {
        resolve(report);
      })
      .catch(err => {
        reject(err);
      });
  });
}

我知道我的 2 个 Promise 单独工作,但是将它们组合成 1 个 Promise 不会触发任何功能。

我怎样才能正确地将它们组合成 1 个承诺?

【问题讨论】:

标签: javascript node.js amazon-web-services amazon-s3 promise


【解决方案1】:

您似乎违反了What is the explicit promise construction antipattern and how do I avoid it?。你正在用一个 Promise 来解决一个 Promise。相反,您只想返回 Promise:

return s3
    .putObject(objectParams)
    .promise()
    .then(data => this.addReport(report, data.location));

【讨论】:

  • s3.putObject(objectParams).promise().then(data => this.addReport(report, data.Location)); 会不会更简洁一些并完全避免使用 Promise 构造函数?
  • @rossipedia 实际上,由于所有.catchs 正在做的是.rejecting,我认为您根本不需要它们。我认为您应该放弃未捕获的 Promise 并让调用者附加.catchs。
【解决方案2】:

您必须返回 addReport 承诺,然后在 then 回调中解析/拒绝原始承诺。

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 2013-04-24
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多