gpt4 book ai didi

javascript - 将同步函数包装到 promise 中的最佳方法是什么

转载 作者:数据小太阳 更新时间:2023-10-29 04:33:21 26 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

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
});

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

关于javascript - 将同步函数包装到 promise 中的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36826592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com