假设我编写了一个库类:
class ComplexThingDoer implements ThingDoer {
...
doComplexThing(arg1, arg2) {
// lots of complex code here
return finalResult;
}
...
}
我已经将这个课程提供给其他人,他们正在按照预期使用它,完全不知道doComplexThing如何实际执行复杂的事情,并将finalResult用于他们正在使用它的任何内容。
现在,假设我确实想要重新实现doComplexThing,这样就不会在这里同步运行大量复杂代码,而是向返回最终结果的专用服务器发出请求。或者调用数据库,其中复杂事物的结果已经预先计算。或者在第一次使用特定参数集调用其中之一并缓存结果,以便下次使用相同参数调用时,它可以返回先前计算的值
据我所知,无论是使用回调,Promises还是async / await,我都搞砸了 - 我不能在不破坏界面的情况下做任何事情。我必须返回一个Promise,或接受一个回调,或者其他东西 - 似乎没有任何方法只是在我得到结果之前不会返回,就像我一样以前总是做的。我的来电者不在乎我如何得到结果;他们只想要结果。
我错过了什么吗?实际上有一种方法可以去除#promis deisisis"一个函数,以便其调用者不必知道它正在执行异步操作?我是否应该先发制人地将所有内容写成Promise,以防万一有一天我可能想以异步方式重新实现它(听起来像一个可怕的想法)?
谢谢!
答案 0 :(得分:1)
不,你不会错过任何东西。如果你使你的函数异步,那么它的每个调用者都必须这样对待它,并且本身也是异步的。在基础事件循环的后续迭代中,异步调用的结果将在以后某个时间上可用。绝对没有办法阻止同步代码等待,因为如果你阻止代码,事件循环不会前进,结果将永远不可用。
将接口从同步切换到异步是一个重大改变。