在javascript中抽象出异步性/承诺?

时间:2017-07-28 11:41:57

标签: javascript asynchronous promise synchronous

假设我编写了一个库类:

class ComplexThingDoer implements ThingDoer {
  ...
  doComplexThing(arg1, arg2) {
     // lots of complex code here
     return finalResult;
  }
  ...
}

我已经将这个课程提供给其他人,他们正在按照预期使用它,完全不知道doComplexThing如何实际执行复杂的事情,并将finalResult用于他们正在使用它的任何内容。

现在,假设我确实想要重新实现doComplexThing,这样就不会在这里同步运行大量复杂代码,而是向返回最终结果的专用服务器发出请求。或者调用数据库,其中复杂事物的结果已经预先计算。或者在第一次使用特定参数集调用其中之一并缓存结果,以便下次使用相同参数调用时,它可以返回先前计算的值

据我所知,无论是使用回调,Promises还是async / await,我都搞砸了 - 我不能在不破坏界面的情况下做任何事情。我必须返回一个Promise,或接受一个回调,或者其他东西 - 似乎没有任何方法只是在我得到结果之前不会返回,就像我一样以前总是做的。我的来电者不在乎我如何得到结果;他们只想要结果。

我错过了什么吗?实际上有一种方法可以去除#promis deisisis"一个函数,以便其调用者不必知道它正在执行异步操作?我是否应该先发制人地将所有内容写成Promise,以防万一有一天我可能想以异步方式重新实现它(听起来像一个可怕的想法)?

谢谢!

1 个答案:

答案 0 :(得分:1)

不,你不会错过任何东西。如果你使你的函数异步,那么它的每个调用者都必须这样对待它,并且本身也是异步的。在基础事件循环的后续迭代中,异步调用的结果将在以后某个时间上可用。绝对没有办法阻止同步代码等待,因为如果你阻止代码,事件循环不会前进,结果将永远不可用。

将接口从同步切换到异步是一个重大改变。

相关问题