承诺拒绝(打字稿)中返回未处理的错误

时间:2020-06-12 05:42:50

标签: javascript typescript promise

因此,在使用Promises方面,我并不是一个真正的新手。我了解并曾经使用过.then(), .catch(), Promise.all()。我主要使用它们来获取API调用。

但是,关于创建自己的诺言,我是一个完整的初学者。

因此,我试图创建自己的诺言,并且reject()函数继续向我发送unhandled error (my rejection message)消息。尽管resolve()函数按预期工作。

这是我的(简体)代码:

const request = require('request-promise');

return new Promise(async (resolve, reject) => {
    try {
        /*
         * Some other codes that might throw other exceptions
         */
        ....
        ....

        const options = "ASSUME THIS IS A CALL TO A THIRD-PARTY API";

        await request(options)
            .then((val: any) => {
                ...
                // I had no issue with this. Resolve returns properly
                resolve(val);                     
            })
            .catch((e: any) => {
                ...

                // I would need to translate the error message from this 
                // Third-Party API. But, this reject function keeps on 
                // returning me an "unhandled error" issue
                reject(translateMsg(e.message, "fr"));
            });
    }
    catch(err) {
        reject("Oops other errors detected");
    }
}

注意:此错误消息显示在我的Firebase功能的日志中。我不确定问题出在我的代码中还是其他地方。

谢谢!

(编辑1) 我在request.catch()语句中做了其他处理(翻译等)。因此,我需要返回一个新的错误消息,而不是默认的e对象。

(编辑2) 假设translateMsg()经过了充分测试,并且始终返回一个字符串。

2 个答案:

答案 0 :(得分:4)

如果您的API已经返回了诺言,则绝对没有理由创建自己的诺言。只需使用您拥有的那个即可。另外,很少建议将async / await与then / catch混合使用。

老实说,最好的做法是根本不添加任何东西。只需return request(options),呼叫者便会收到并承诺已经自行解决或拒绝。

如果您绝对必须根据解析度或拒绝度更改呼叫所接收的内容,则可以将您的操作简化为:

const options = "ASSUME THIS TO BE AN API CALL";
try {
    const val = await request(options)
    // maybe you want to change val here?  Return what you want.
    return val
}
catch (err) {
    throw "Oops other errors detected"
}

答案 1 :(得分:0)

首先,感谢大家指出了兑现承诺方面的所有最佳做法。我将相应地修复我的代码。

我的问题原来是由我使用的 Google Firebase函数引起的。

在重新访问文档时,我意识到处理Firebase Function中的错误的正确方法是抛出throw new functions.https.HttpsError("")而不是Promise.reject()

再次感谢!

Firebase Function Error Handling

来源:https://firebase.google.com/docs/functions/callable