我開始在我的NodeJS項目中使用承諾,並遇到問題。在閱讀Promises/A +規範並搜索了很多內容之後,我沒有找到一個很好的解決方案,我需要訪問在承諾鏈中生成的值。在我的示例中,我想檢查圖像是否創建時發生錯誤,如果是,我想刪除它。NodeJS Promise(Q) - 如果承諾失敗,如何獲得價值?
代碼:
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是一個非常昂貴的方法 - 所以這是不可能的。我正在尋找一個不同的解決方案,而不是保存在一個臨時變量=) – stahlstift