假设我写了一个库类:
class ComplexThingDoer implements ThingDoer {
...
doComplexThing(arg1, arg2) {
// lots of complex code here
return finalResult;
}
...
}
我已经将这个类提供给其他人,他们按预期使用它,完全不知道 doComplexThing 实际上如何完成复杂的事情,以及如何将 FinalResult 用于他们使用它的任何用途。
现在,假设我决定实际上要重新实现 doComplexThing,这样它就不会在这里同步运行大量复杂代码,而是向专门的服务器发出请求,返回最终结果。或者调用数据库,其中已经预先计算了复杂事物的结果。或者在第一次使用一组特定的参数调用时执行其中一项操作,并缓存结果,以便下次使用相同的参数调用它时,它可以只返回之前计算的值。
据我所知,无论我使用回调、Promises 还是 async/await,我都完蛋了 - 在不破坏界面的情况下我无法做任何这些事情。我必须返回一个 Promise,或者接受一个回调,或者其他什么 - 似乎没有任何方法可以在得到结果之前不返回,就像我以前一直做的那样。我的来电者并不关心我如何得到结果;他们关心我如何得到结果。他们只是想要结果。
我错过了什么吗?实际上是否有一种方法可以“取消 promise ”函数,以便其调用者不必知道它正在执行异步操作?我是否应该先发制人地将所有内容编写为 Promise,以防万一有一天我可能想以异步方式重新实现它(听起来是一个糟糕的主意)?
谢谢!
最佳答案
不,你没有错过任何东西。如果您使函数异步,那么它的每个调用者都必须将其视为异步函数,并且本身也是异步的。异步调用的结果将在稍后底层事件循环的后续迭代中可用。绝对没有办法阻止同步代码来等待,因为如果您在代码中阻塞,事件循环将不会前进,结果将永远不会可用。
将接口(interface)从同步切换为异步是一项重大更改。
关于javascript - 在 JavaScript 中抽象掉异步/ promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45372626/