-1

我对非阻塞架构很着迷。虽然我没有使用过 Node.js,但我在概念上已经掌握了它。此外,我一直在开发一个事件驱动的 Web 应用程序,因此我对事件编程有基本的了解。

您如何在浏览器中编写非阻塞 javascript?我想这在某些方面一定与 Node 的做法不同。例如,我的应用程序允许用户加载大量数据(序列化为 JSON)。解析此数据以重构应用程序状态。这是一项繁重的操作,可能会导致浏览器锁定一段时间。

我相信使用网络工作者是一种方式。(这似乎是显而易见的选择,然而,Node 实现了一个非阻塞的、事件驱动的架构,我相信不使用 Web Workers,所以我想肯定有另一种方式。)我相信计时器也可以发挥作用。我阅读了 TameJS 和其他一些扩展 javascript 语言的库。我对使用本机 javascript 而不引入新语言语法的 javascript 库感兴趣。

资源、图书馆和实际示例的链接非常受欢迎。

编辑:

了解了更多,我意识到我所说的属于“期货”一词。然而,jQuery 实现了这一点,它总是使用 XHR 调用服务器,服务器在返回结果之前进行处理,而我在做同样的事情而不调用服务器,客户端进行处理但在非阻塞方式。

http://www.erichynds.com/jquery/using-deferreds-in-jquery/

4

2 回答 2

2

三是在浏览器上做非阻塞工作的两种方法

  • 网络工作者。WebWorkers 创建一个新的隔离线程供您进行计算,但是浏览器支持告诉您 IE<10 讨厌您。
  • 不这样做,不应该在客户端上以阻塞方式完成昂贵的工作,向服务器发送 ajax 请求来执行此操作,然后让服务器返回结果。

穷人的话题:

您可以使用一些技巧:

  • 通过使用模拟时间拼接setTimeout。这基本上意味着,在每次“大块”工作之后,您可以通过调用setTimeout(doMore, 10). 这基本上是以一种非常糟糕的非优化方式编写你自己的进程调度程序,而是使用网络工作者
  • 通过使用自己的 html 文档创建 iframe 来创建“新流程”。在这个 iframe 中,您可以在不阻止自己的 html 文档响应的情况下进行计算。
于 2011-10-12T14:12:51.377 回答
0

What do you mean by non-blocking specifically?

The longest operations, Ajax-calls, are already non-blocking (async)

If you need some long-running function to run "somewhere" and then do something, you can call

 setTimeout(function, 0)

and call the callback from the function.

And you can also read on promises and here as well

于 2011-10-11T17:25:13.270 回答