javascript - NodeJS Promise (Q) - 如果 promise 失败,如何获取值?

标签 javascript node.js promise q

我开始在我的 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/

相关文章:

node.js - Swift POST 请求不工作

javascript - 如何在 NodeJS mongodb 驱动程序版本 2.2 中使用 Promise

javascript - 如何编写任意长的Promise链

node.js - Promise 正在解析但不触发 Node 中的 .then() 函数

javascript - 使用 CSS 过渡动画 SVG 元素的位置

javascript - jQuery ui Accordion - 不同的折叠面板?

javascript - 从 unix 时间戳获取以微秒为单位的 ISOString

node.js - SailsJs 调用 save 方法后没有任何反应

javascript - Socket.io 发送消息两次(或更多)

javascript - 如何使用node js中的moment.js根据当前日期生成一年的季度数和年份数的数组?