我开始在我的 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);
最佳答案
我推荐这种方法:
return makeImage().then(function (path) {
return doSomeCoolThings(path)
.finally(function () {
return removeImage(path);
});
});
假设您相信 makeImage、removeImage 和 doSomeCoolThings 会返回 Q promise 并且永远不会抛出异常。否则,总有 Q.fcall
可以消除这些顾虑。
如果想保留成功的图片,只有失败才删除,重新抛出错误:
return Q.fcall(makeImage).then(function (path) {
return Q.fcall(doSomeCoolThings, path)
.catch(function (error) {
return Q.fcall(removeImage, path)
.thenReject(error);
});
});
此外,代替:
var deferred = Q.defer();
deferred.resolve(x);
return deferred.promise;
您可以:
return Q.resolve(x);
关于javascript - NodeJS Promise (Q) - 如果 promise 失败,如何获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21121245/