JavaScript在大多数处理磁盘IO和网络等"慢"事务的现代API中使用异步调用。我知道这样做的目的是什么,但是在某些情况下,确实需要进行同步调用。
例如,我有一个无法重写的JavaScript代码。在代码中有对某个方法的同步调用。出于在开发人员环境中进行调试的目的,我希望截获此调用,将信息发送到服务器,然后等待服务器响应。这个拦截器在生产中不起作用。AFAIK,有一种方法可以通过NPAPI实现这一点,但现在它被正式弃用。Google Chrome和MozillaFirefox都只提供异步套接字API,所以我没有机会执行这样的拦截。另一种方法是发送syncrhonous XMLHttpRequest,但速度相当慢,需要HTTP连接和HTTP负载,所以我更喜欢WebSocket。
我有另一个角落的情况,我必须调用IndexedDB,但这很难解释。遗憾的是,IndexedDB同步API没有在任何地方实现。
同步调用异步方法还有其他技巧吗?我会接受浏览器特定的黑客攻击,浏览器插件,插件等等。或者可能有人知道如何要求所有开发Web标准的委员会(以及浏览器开发人员(至少包括syncrhouse API的WebWorker版本?
我知道,关于同步调用异步方法的问题被问了很多次,通常的答案是"这是个坏主意"。我意识到通常这是个坏主意,但在某些情况下,我们确实需要同步调用的自由。
我不知道有什么办法。我通常将异步代码描述为病毒性的:它会以更异步的方式快速感染周围的代码。我不知道有什么方法可以打破这种局面,而且在我看来也不太可能有办法。显然,有一些技术可以让异步代码看起来更同步,从Promises开始,一直到宏等等。但最终,运行时仍然是异步的。
也许比我聪明的人可以提供一个有趣的建议。我也很想听,尽管我现在没有任何个人需要。
您可能需要考虑的其他一些想法:
对于基于网络的流量
使用代理服务器拦截通信。我在这里找到了一篇文章,讨论使用带有web套接字的代理服务器。一个写得正确的代理可以保留传输的数据,直到它与服务器的交换完成,然后再转发。
对于IndexedDb
你可以围绕IndexedDb调用创建一个wrapper
函数,或者至少是你需要的调用,这将允许你插入你需要的任何行为。这个包装器可以在调用回调方法之前修改数据并执行自己的异步业务。