javascript - 在 JavaScript 中抽象掉异步/ promise ?

标签 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,或者接受一个回调,或者其他什么 - 似乎没有任何方法可以在得到结果之前不返回,就像我以前一直做的那样。我的来电者并不关心我如何得到结果;他们关心我如何得到结果。他们只是想要结果。

我错过了什么吗?实际上是否有一种方法可以“取消 promise ”函数,以便其调用者不必知道它正在执行异步操作?我是否应该先发制人地将所有内容编写为 Promise,以防万一有一天我可能想以异步方式重新实现它(听起来是一个糟糕的主意)?

谢谢!

最佳答案

不,你没有错过任何东西。如果您使函数异步,那么它的每个调用者都必须将其视为异步函数,并且本身也是异步的。异步调用的结果将在稍后底层事件循环的后续迭代中可用。绝对没有办法阻止同步代码来等待,因为如果您在代码中阻塞,事件循环将不会前进,结果将永远不会可用。

将接口(interface)从同步切换为异步是一项重大更改。

关于javascript - 在 JavaScript 中抽象掉异步/ promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45372626/

相关文章:

javascript - 是否可以禁用 lightningChartJS 图表中的缩放?

javascript - ES6 WeakMap 类封装

c# - 本地任务如何在完成之前避免垃圾回收

python - 与 Tornado WebSocket 服务器的并发连接

scala - 'Nothing' 的 promise 永远不会完成?

javascript - 类型错误 : adapter is not a function error when using axios and webpack in Chrome extension

javascript - $scope 值没有在 Controller 中更新,仅在我按下刷新时才有效

.net - 在多线程环境中使用TraceSource

javascript - PromiseRejectionEvent 是如何触发的?

javascript - 什么是 Promise<{}>?