尝试并抓住承诺

2024-02-26

我需要编写一个返回承诺的函数,首先我调用一个返回一些结果的同步函数 A() 。 然后返回一个函数 B(result),其中 B 是一个接受 A() 结果的 Promise。 如果任一函数失败,我希望调用相同的错误函数 C(error),其中 C 是一个承诺。 写这个的最好方法是什么。这就是我所拥有的,但我认为我显然缺少什么

function() {
    try {
        var result = A();
        return B(result)
            .catch(function(error) {
                return C(error);
            });
     }
     catch(error) {
         return C(error);
     }
}

将同步 try 和 catch 与 Promise .catch 结合起来似乎是错误的,而且我需要在两个不同的地方调用 C(error) 也是错误的。

A() 抛出错误而不是返回错误代码。


你没有具体说怎么做A()失败了。它可能会抛出错误,也可能会返回错误结果。我将展示两者的方案。混合同步和异步的关键是始终返回一个承诺。无论函数如何成功或失败,这都会为调用者提供一致的接口。

如果你只是担心A()抛出异常并且不返回错误代码,那么你可以这样做:

function someFunction() {
    try {
        var result = A();
        return B(result);
     } catch(err) {
         return Promise.reject(err);
     }
}

someFunction().then(function(result) {
    // code here to process the final result
}).catch(C);

如果你也有这样的情况A()可以返回错误代码,那么你可以这样做:

function someFunction() {
    try {
        var result = A();
        // check for error value
        if (result < 0) {
            throw result;
        }
        return B(result);
     } catch(err) {
         return Promise.resolve(err);
     }
}

请注意,如果不需要,这两种模式都会避免创建额外的承诺。它们仅在返回同步发生的错误时创建额外的承诺。


The 蓝鸟承诺图书馆 http://bluebirdjs.com/docs/api/promise.method.html针对这种特殊情况有一个辅助函数,称为Promise.method。的效用Promise.method()是它自动将您的函数包装在 try/catch 处理程序中,如果抛出任何同步异常,它会自动将它们转换为返回被拒绝的承诺。你可以这样使用它:

var someFunction = Promise.method(function() {
    var result = A();
    // check for error condition
    if (result < 0) {
        throw result;
    }
    return B(result);
});

someFunction().then(function(result) {
    // code here to process the final result
}).catch(C);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试并抓住承诺 的相关文章

随机推荐