我想知道你怎么看待这个问题。 推荐使用的网络工作者同步请求(XMLHttpRequest的)? 我能找到什么问题?
我在我的应用程序一直在测试这个,我还没有发现任何问题。 但我怕的,因为老经验与jQuery和AJAX这个SYNCHRONUS行为。 我的应用程序中获取数据的一个很大的数目从几个数据库中的表,而这需要时间。 对于从表中检索数据的每串,我需要立即处理它不耽误整个事情太多了。 同时,用户与浏览器交互,因此它可以被阻止,我认为网络工作者将正常工作。 你的事情,这是一个很好的解决方案? 或者我应该尝试用asynchronus请求?
谢谢。
我没有确凿的事实,但既然你问意见... :)
有在Chrome中讲述的问题:有太多的网络工作者可能会导致无声崩溃(帽〜60-100,根据这个错误报告 )。 普遍的问题是Web Workers是资源密集型的,至少V8。
假设你要最终使多个HTTP调用,如果你在一个网络工作者做同步HTTP调用:
- 从某种意义上说,你的交易的异步Web工人异步HTTP调用,这只会增加一个中间混进去,你还有异步处理事情。
- 如果你去了更简单,更有效利用资源的路线和只使用一个网络工作者,你会花大量的时间等待它给你答复。
- 如果,另一方面,您可以使用多个Web工作者,你可能会需要跟踪其中一个是免费的,哪一个是忙,等等,在这种情况下,您将创建一个土生土长的调度,而不是使用什么来烤到浏览器。
- 最后,Web Workers是昂贵的(显然),你可能最终创建多个Web工人只是这样他们就可以坐在那里等待一个HTTP调用来完成。
我不认为自己对此事的专家,所以请借此为它的价值。
更新:添加一些优点/缺点的各种情况。
有些职业/使用Web工作时,使同步和异步HTTP调用之间进行选择时浮现在脑海中的缺点:
- 一般情况下,同步请求将是更容易编写,并会导致代码很容易遵循。 同步请求的一个缺点是它们可能会鼓励编写应划分出到单独的,更小的功能久的功能。
- 如果你正在做一个单呼,在它里面采用两种方法和同步是更好,因为它是一个简单一点之间完成的时间没有区别。 我说这只是一个简单一点,因为有一个回调监听一个单一的非同步呼叫实在是相当简单。
- 如果你正在做的是在一个特定的顺序发生,就像基于地址加载用户的配置文件数据,然后让当地天气多次调用,同步调用会更好,因为它会更容易写,更容易很多读。 关于阅读它的主要问题是在调用顺序依赖将通过使同步调用和他们的功能顺序的选择必须清楚地说明。 这些电话多有,越这将关系。 如果有许多人呼吁,在复杂的差异很可能是剧烈的。
- 如果你不得不做出这样不需要任何特定的顺序发生多次调用,然后异步请求是更好,因为整个过程很可能是数量级比同步请求更快。 你正在做的电话或更慢的连接,在总时间越显著差异会; 这种差异将会增长很快(成倍?)。 从某人阅读代码的角度来看,我认为使用同步请求,在这种情况下,会有些误导,因为这将意味着有一个连续的性质,在两个电话,即使没有。 从写一系列非同步的请求不依赖于对方的角度来看,它不应该是太糟糕了,因为你只设置一个计数器,使所有的电话,在每个回调的增加计数器,你就完蛋了当计数器等于呼叫的号码,你做。
更新: @rbrundritt使得一个非常有趣和相关的评论意见对这样的回答:
有一件事我发现网络工作者的工作是,他们似乎每个增益自己的HTTP限制。 浏览器限制并发的HTTP请求的数量,大约8或12取决于限制之前,浏览器,它可以是一个瓶颈,如果你有大量的请求来处理的。 我发现,如果我通过我的请求,网络工作者,每个人都可以做8到12个并发请求他们开始节流之前。 这对于一些应用程序带来巨大的好处。
@rbrundritt
我只是想补充的说明(即太长的评论),在@ tiffon的答复中提到60个网络工作者的〜限制没有出现在铬存在了。 我可以在Chrome中创建500名工人像这样没有任何错误/崩溃:
let workers = [];
for(let i = 0; i < 500; i++) {
let worker = new Worker(URL.createObjectURL(new Blob([`console.log('cool${i}')`])));
worker.postMessage({});
workers.push(worker);
}
await new Promise(r => setTimeout(r, 15000));
for(let i = 0; i < workers.length; i++) {
workers[i].terminate();
}
虽然,这是很难想象的情况下数百名工人将是适当的,因为核心数量目前不走不是围绕64高。