假设我有一个像 path.join()
这样的同步函数。我想将它包装成 Promise
因为我希望在 catch()
块中处理异常。如果我像下面这样包装它,我不会在 Promise
的 .catch()
块中得到异常。所以我必须使用 if
检查返回值是否错误,然后调用 resolve
或 reject
函数还有其他解决方案吗?
var joinPaths = function(path1,path2) {
return new promise(function (resolve, reject) {
resolve(path.join(path1, path2));
});
};
原文由 s1n7ax 发布,翻译遵循 CC BY-SA 4.0 许可协议
目前还不清楚为什么要将同步操作包装在 promise 中,因为这只会让它更难使用,而同步操作已经可以在 promise 链中使用了。
我看到只有两个地方可以从同步的东西中做出承诺是有用的,那就是开始一个承诺链,其中后续操作将是异步的,或者当你正在分支时,分支的一个结果是异步承诺,另一个是同步的。然后,在这种情况下,您只想在两种情况下都返回一个承诺,这样无论采用哪个分支,调用者都有一个一致的异步接口。或者,这也可能发生在公共 API 的不同实现中,一个实现是同步的,另一个是异步的。 API 将设计为具有异步接口,而同步实现可能会将自己封装在一个承诺中,以实现通用 API 的异步契约。
除此之外,您通常不应该将同步事物设为异步,因为这只会使它们的使用变得不必要地复杂化。
我所知道的将其变成承诺的最简单方法是:
根据您的评论,在
.then()
处理程序中,异常已经被 promise 基础设施捕获并变成了被拒绝的 promise。所以,如果你有这个:然后,该异常已经映射到您的承诺拒绝中。当然,如果你想处理
.then()
处理程序内部的异常(而不是将承诺变成拒绝),那么你可以在同步操作周围使用传统的 try/catch 来捕获本地异常(与任何其他同步代码没有什么不同)。但是,如果您希望承诺在.then()
处理程序中存在异常时拒绝,那么这一切都会自动为您完成(承诺的一个非常好的功能)。