用于进行同步JavaScript调用的黑客

时间:2014-05-23 16:38:22

标签: javascript asynchronous websocket npapi indexeddb

JavaScript在大多数现代API中使用异步调用来处理磁盘IO和网络等“缓慢”的事情。我意识到了这个目的是什么,但是在某些情况下确实需要进行同步调用。

例如,我有一个我无法重写的JavaScript代码。在代码中有对某个方法的同步调用。对于开发人员环境中的某些调试目的,我想拦截此调用,将信息发送到服务器并等待服务器响应。这个拦截器不适用于生产。 AFAIK,有一种方法可以用NPAPI做到这一点,但现在它已被正式弃用。 Google Chrome和Mozilla Firefox都只提供异步套接字API,因此我没有机会执行此类拦截。另一种方法是发送同步XMLHttpRequest,但速度相当慢,需要HTTP连接和HTTP负载,所以我更喜欢WebSocket。

我还有另一个案例,我必须调用IndexedDB,但很难解释。不幸的是,IndexedDB sync API没有在任何地方实现。

还有其他黑客可以同步调用异步方法吗?我会接受浏览器特定的黑客攻击,浏览器插件,插件等等。或者可能有人知道如何要求所有那些开发Web标准的委员会(以及浏览器开发人员)至少包含WebWorker版本的syncrhonous API?

我知道,有关同步调用异步方法的问题被多次询问,而常见的答案是“这是一个坏主意”。我意识到一般这是一个坏主意,但在某些情况下,我们确实需要自由同步调用。

2 个答案:

答案 0 :(得分:2)

我不知道任何方式。我通常将异步代码描述为病毒:它会以更多的异步性快速感染周围的代码。我不知道有什么方法可以打破这种局面,而且我似乎不太可能有办法。显然,有一些技术可以使您的异步代码看起来更加同步,从Promises开始,然后继续使用宏等。但最终,运行时仍然是异步的。

也许比我聪明的人可以提供一个有趣的建议。我也很乐意听到它,虽然我现在没有任何个人需求。

答案 1 :(得分:1)

您可能需要考虑的其他一些想法:

对于基于网络的流量

使用代理服务器拦截通信。我发现an article here讨论了使用带有Web套接字的代理服务器。正确编写的代理可以保留传输的数据,直到与服务器的交换完成,然后将事情转发。

对于IndexedDb

您可以围绕IndexedDb调用创建一个wrapper函数,或者至少是您需要的函数,这样您就可以插入所需的行为。这个包装器可以修改数据并执行自己的异步业务调用回调方法。