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

时间:2016-04-24 17:32:41

标签: javascript node.js promise

假设我有一个像path.join()这样的同步功能。我希望将其包含在Promise中,因为我希望在catch()块内处理异常。 如果我像下面那样换行,我在Promise的{​​{1}}块中不能例外。所以我必须使用.catch()来检查返回值,如果它是一个错误,然后调用resolve,拒绝函数。还有其他解决方案吗?

if

2 个答案:

答案 0 :(得分:11)

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

我认为从同步事物中做出承诺有用的唯一两个地方是启动一个承诺链,后续操作将是异步的,或者当你进行分支时,分支的一个结果是异步承诺而另一个是同步的。然后,在这种情况下,您只想在两种情况下都返回一个promise,这样无论采用哪个分支,调用者都有一致的异步接口。

除此之外,你通常不应该使同步事物异步,因为它只是不必要地使用它们变得复杂。

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

str

根据您的评论,在Promise.resolve(path.join(path1, path2)).then(function(path) { // use the result here }); 处理程序中,promise基础结构已捕获异常,并将其转换为拒绝的承诺。所以,如果你有这个:

.then()

然后,该异常已经映射到您的承诺拒绝。当然,如果你想处理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转为拒绝),那么你可以在同步操作中使用传统的try / catch来捕获本地异常(no与任何其他同步代码不同)。但是,如果您希望承诺拒绝.then()处理程序中的异常,那么这一切都是自动完成的(承诺的一个非常好的功能)。

答案 1 :(得分:1)

不确定这是否是最好的方法,但是它可以工作。我来到StackOverflow来检查是否有更好的方法。

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