我正在使用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步和第2步共享相同的'database.then',所以我想使用它,但我不知道如何压扁承诺。
如果有任何问题(包括事件无效),我应致电elib.deleteFromS3('image_uploads/' + id);
如果这一切都成功了,我准备通过在数据库中添加一个新条目来“提交”:
images.insert({ _id: id, size: pic.size })
如果有效,我们就完成了。如果没有,我仍然需要再次从S3中删除。
在满足错误处理和'database.then'重用的同时保持可读性的任何帮助都将非常感激。
答案 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!")
});