将同步函数包装到承诺中的最佳方法是什么

新手上路,请多包涵

假设我有一个像 path.join() 这样的同步函数。我想将它包装成 Promise 因为我希望在 catch() 块中处理异常。如果我像下面这样包装它,我不会在 Promise.catch() 块中得到异常。所以我必须使用 if 检查返回值是否错误,然后调用 resolvereject 函数还有其他解决方案吗?

 var joinPaths = function(path1,path2) {
  return new promise(function (resolve, reject) {
    resolve(path.join(path1, path2));
  });
};

原文由 s1n7ax 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 483
2 个回答

目前还不清楚为什么要将同步操作包装在 promise 中,因为这只会让它更难使用,而同步操作已经可以在 promise 链中使用了。

我看到只有两个地方可以从同步的东西中做出承诺是有用的,那就是开始一个承诺链,其中后续操作将是异步的,或者当你正在分支时,分支的一个结果是异步承诺,另一个是同步的。然后,在这种情况下,您只想在两种情况下都返回一个承诺,这样无论采用哪个分支,调用者都有一个一致的异步接口。或者,这也可能发生在公共 API 的不同实现中,一个实现是同步的,另一个是异步的。 API 将设计为具有异步接口,而同步实现可能会将自己封装在一个承诺中,以实现通用 API 的异步契约。

除此之外,您通常不应该将同步事物设为异步,因为这只会使它们的使用变得不必要地复杂化。

我所知道的将其变成承诺的最简单方法是:

 Promise.resolve(path.join(path1, path2)).then(function(path) {
   // use the result here
});

根据您的评论,在 .then() 处理程序中,异常已经被 promise 基础设施捕获并变成了被拒绝的 promise。所以,如果你有这个:

 someAsyncOp().then(function(value) {
   // some other stuff
   // something that causes an exception
   throw new Error("timeout");
}).catch(function(err){
   console.log(err);   // will show timeout
});

然后,该异常已经映射到您的承诺拒绝中。当然,如果你想处理 .then() 处理程序内部的异常(而不是将承诺变成拒绝),那么你可以在同步操作周围使用传统的 try/catch 来捕获本地异常(与任何其他同步代码没有什么不同)。但是,如果您希望承诺在 .then() 处理程序中存在异常时拒绝,那么这一切都会自动为您完成(承诺的一个非常好的功能)。

原文由 jfriend00 发布,翻译遵循 CC BY-SA 4.0 许可协议

不确定这是否是最好的方法,但它确实有效。我来 StackOverflow 看看有没有更好的方法。

 new Promise((resolve, reject) => {
    try {
        resolve(path.join());
    } catch (err) {
        reject(err);
    }
})

原文由 Thanish 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题