【发布时间】:2014-03-11 03:51:48
【问题描述】:
我开始在我的 NodeJS 项目中使用 Promise,但遇到了问题。在我阅读了 Promises/A+ 规范并进行了很多谷歌搜索之后,我没有找到一个很好的解决方案来解决我需要访问在 Promise 链中生成的值的情况。在我的示例中,如果创建了图像,我想检查何时发生错误,如果是,我想删除它。
代码:
var Q = require('Q');
var fs = require('fs');
// This produces the imgPath
function makeImage() {
var deferred = Q.defer();
deferred.resolve("path/to/image");
return deferred.promise;
}
function watermark(imgPath) {
var deferred = Q.defer();
deferred.resolve(imgPath);
return deferred.promise;
}
// This function fails
function doSomeCoolThings(imgPath) {
var deferred = Q.defer();
deferred.reject(new Error("System is exploded"));
return deferred.promise;
}
var fileExists = Q.denodeify(fs.readFile);
var deleteFile = Q.denodeify(fs.unlink);
// How do I get the imgPath here?
function deleteImageIfPresent(err) {
return Q.fcall(function () {
return imgPath !== undefined;
})
.then(fileExists)
.then(deleteFile);
}
var iKnowThatSolution;
makeImage()
// Thats not what I want
//.then(function(imgPath) {
// iKnowThatSolution = imgPath;
//})
.then(watermark)
.then(doSomeCoolThings)
.fail(deleteImageIfPresent);
【问题讨论】:
-
我认为将 imagePath 保存在某处可能是最简单的,或者在失败块内再次调用
makeImage。 -
makeImage 是一种非常昂贵的方法 - 所以这是不可能的。我正在寻找与保存在临时变量中不同的解决方案 =)
标签: javascript node.js promise q