清理承诺(扁平化和错误处理)

时间:2013-09-02 23:08:33

标签: javascript promise when-js

我正在使用when库,并且有一些像这样的代码:

when.join(
    database.then(function(db) {
        return db.collection("incidents");
    }).then(function(col) {
        return col.idExists(incidentId);
    }),
    database.then(function(db) {
        return db.collection("images");
    }),
    elib.uploadToS3(pic.path, 'image_uploads/' + id, pic.type)
).spread(function(exists, images, url) {
    if(!exists) {
        throw new Error("Incident id does not exist");
    }

    console.log("Image sucessfully uploaded to: ", url);
    return images.insert({
        _id: id,
        size: pic.size
    });
}).then(function() {
    console.log("At this point, it's totally succesfully recorded in the database!")
});

代码具有合理的可读性,但逻辑是:

  1. 确保incidentId有效
  2. 获取图片表
  3. 将图像上传到S3
  4. 这三个都可以同时发生。第1步和第2步共享相同的'database.then',所以我想使用它,但我不知道如何压扁承诺。

    如果有任何问题(包括事件无效),我应致电elib.deleteFromS3('image_uploads/' + id);

    如果这一切都成功了,我准备通过在数据库中添加一个新条目来“提交”: images.insert({ _id: id, size: pic.size })

    如果有效,我们就完成了。如果没有,我仍然需要再次从S3中删除。

    在满足错误处理和'database.then'重用的同时保持可读性的任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:2)

  

步骤1和2都共享相同的'database.then',所以我想使用它,但我不知道如何压扁承诺。

你已经两次重复使用相同的database承诺了(这很棒),你只是在承诺的两个不同的映射之后,在这样的情况下使用两个不同的then调用是合乎逻辑的。案件。试图用一个这样做是不合理的,显然不会给你任何好处。

在我确定有理由进行操作之前,我也不会乱用S3。 所以我会做1并继续2& 3只有在id存在后才会出现:

database.then(function(db) {
  return db.collection("incidents");
}).then(function(col) {
  return col.idExists(incidentId);
}).then(function (exists) {
  if (!exists) throw new Error("Incident id does not exist");
  return when.join(
    database.then(function(db) {
      return db.collection("images");
    }),
    elib.uploadToS3(pic.path, 'image_uploads/' + id, pic.type)
  ).spread(function(images, url) {
    console.log("Image sucessfully uploaded to: ", url);
    return images.insert({
      _id: id,
      size: pic.size
    })(null, function (err) {
      return elib.deleteFromS3('image_uploads/' + id).then(function () {
       throw err;
      });
    });
}).then(function() {
  console.log("At this point, it's totally succesfully recorded in the database!")
});