因此,在使用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()
经过了充分测试,并且始终返回一个字符串。
答案 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()
。
再次感谢!