JavaScript - 同步等待异步操作(睡眠)

2023-11-27

我知道这里被问过很多次,也被回答过很多次,这不是应该如何完成的方法,但再一次:)

是否有可能以某种方式调用异步函数(例如计时器/ajax 调用),基本上是常见的异步任务,并同步等待它结束,而不会出现 100%CPU 使用率和阻塞浏览器的情况?

简单的回答就足够了——是或否。如果不是,我必须根据异步操作以“异步方式”编写所有代码,否则会更好;)

想象一下这样的事情:

updateCSS("someurl.css")

function updateCSS(url) {

   var css = getCachedResource(url);

   css = css.replace(/regexp/gm, function(curUrl) {
     base64 = atob(getCachedResource(curUrl))
     return "data:image;base64," + base64
   })

}

function getCachedResource(url) {
  
  //...
  
  if (cached) {
    
    return cached
    
  } else {
    
    // doajax...    
    // watfor
    
    return loaded
  }
  
}

当然,我可以让它异步,但是代码会......很糟糕。此外,我必须异步调用该函数的所有函数。你能看到简单的解决方案吗?我想说的是,阻止是最简单的。

Thanks


所以只是总结一下......

答案是不。永远不可能阻塞函数或任何其他代码并等待异步操作完成。 JavaScript VM 没有直接支持它的机制。

特别是在浏览器环境中,不可能操作 JavaScript 虚拟机事件循环(因为 Node 可以操作,并且“deasync”库实际上是如何做到这一点的)。

这是因为 JavaScript 并发模型和事件处理,如下所述:

https://developer.mozilla.org/cs/docs/Web/JavaScript/EventLoop

这与 JavaScript 是单线程的事实无关。

另外,请注意,所有诸如 Promises 之类的东西和诸如等待/异步之类的新功能都只是一种不同的方式,即如何编写/管理异步任务的代码。它不会也永远不会有助于将异步转变为同步。

因此,不要像我一样花时间试图找到一种方法来做到这一点。而是通过设计异步代码来花费它;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript - 同步等待异步操作(睡眠) 的相关文章

随机推荐