【发布时间】:2016-08-09 11:34:20
【问题描述】:
我有一个 nodeJS 项目,我希望在其中使用异步函数。也就是说,我正在使用Q 库。
我有一个名为 someFunction() 的函数,我希望返回一个 Promise。使用 then 函数,我可以像这样检查承诺是被解决还是被拒绝:
someFunction()
.then(
function(results) {
console.log("Success!");
},
function (error) {
console.log("An error occurred, and I would wish to log it for example");
}
);
我对上述函数的直觉期望是,错误函数会捕获所有可能的错误。因此,如果在 someFunction 内部引发了一些异常,我可以放心,错误函数将运行('then' 之后的第二个函数)。但好像不是这样的。
例如,假设 someFunction 会这样定义:
function someFunction() {
var deferred = Q.defer();
throw new Error("Can't bar.");
deferred.resolve("success");
}
现在,如果我像在上面的代码块中那样调用函数 someFunction(),它不会运行错误函数。这是为什么?承诺 Q.deferred 的部分重点不是捕获错误吗?为什么我要手动拒绝发生的每个错误?我知道我可以将 someFunction 的全部内容设置为 try/catch 子句,然后拒绝延迟,但这感觉太不对了!一定有更好的方法,我知道你们中的一些人肯定知道!
有了这些信息,我开始思考 deferred.reject 和 deferred.resolve 到底应该用在哪里?它甚至意味着捕获异常吗?我真的应该手动检查所有错误案例,然后调用 deferred.reject 吗?我很想知道应该如何专业地处理这件事。
【问题讨论】:
-
这就是为什么 a) 不应该抛出任何返回承诺的函数 b) 你 should prefer the promise constructor over deferreds
-
但是你怎么能保证一个没有返回承诺的函数不会抛出呢?我的意思是您可能正在使用一些外部库?但是,我认为您可能走在正确的轨道上,也许您可以提供答案。
-
通过调试/消除错误,并将可能抛出的代码包装在 try..catch 块中并处理错误;也许通过返回
Q.reject(error)。
标签: javascript node.js q deferred