Oli*_*ain 5 javascript ajax server-sent-events
这些API是否与Server-Sent Event对称,以便从浏览器到服务器生成" 即发即弃"事件?我知道如何不回复服务器端的请求,但如何告诉浏览器它不需要等待回复?
这里的目标是节省客户端资源,比如说你想尽快向服务器发送10k事件,而不是关心服务器回复的内容.
编辑:虽然与问题大多无关,但这里有一些关于我正在研究的项目的背景,它将利用"AJAX即发即忘".我想为Scala.js构建一个JavaScript网络库,它将其应用程序作为JVM上的Akka actor和浏览器(使用Scala.js编译)之间的传输层.当WebSockets不可用时,我希望有一些回退,并且在每个JS-> JVM消息的往返期间都有一个挂起的连接是不可接受的.
正如您所问的“如何告诉浏览器它不需要等待回复?” 我假设您不想处理服务器回复。
在这种情况下,最好使用 Google 实现的一种像素图像响应技巧,用于分析和跟踪,以及许多其他此类服务。
诀窍是使用 javascript 创建新图像并设置 src 属性,浏览器将立即触发图像请求,浏览器可以并行请求多个此类请求。
var image = new Image();
image.src = "your-script.php?id=123&other_params=also";
Run Code Online (Sandbox Code Playgroud)
优点:易于在服务器/客户端上实现更少的负载,然后是 ajax 请求
缺点:您只能使用此方法发送 GET 请求。
编辑
更多参考:
http://help.yahoo.com/l/us/yahoo/ywa/faqs/tracking/advtrack/3520294.html
https://support.google.com/dfp_premium/answer/1347585?hl=en
他们再次使用相同的像素图像技术。
因此,需要明确的是,您正在尝试使用 XMLHttpRequest 作为网络通信的代理,这意味着您 100% 受 XMLHttpRequest 提供的任何内容的支配,对吧?
我的看法是,如果您打算为此坚持使用 XMLHttpRequest,那么您将不得不接受服务器响应。只需异步调用并让无操作函数处理响应即可。考虑其他人的建议,使用服务器上的队列(或服务器上的异步方法),以便立即返回客户端。否则,我真的认为 JavaScript 对于你所描述的工作来说是错误的工具。
XMLHttpRequest 在每个浏览器中都将是不同的实现(呈现或多或少通用的接口契约)。我的意思是,微软发明了这个东西,然后其他浏览器制造商模仿它,然后瞧,每个人都开始称之为 Web 2.0。重点是,如果您在 XMLHttpRequest 的核心部分过于用力,您可能会在不同的浏览器中得到不同的行为。
据我所知,XMLHttpRequest 严格使用 TCP(无 UDP 选项),因此至少您的客户端将从服务器接收 TCP ACK。没有办法告诉服务器不要在该级别响应。它已融入 TCP/IP 网络堆栈中。
此外,通信使用 HTTP 协议,因此服务器将使用 HTTP 标头进行响应......对吗?我的意思是,这就是协议的定义方式。让 HTTP 变得不同有点像让猫像鸡一样叫。
即使您可以通过在 XMLHttpRequest 上调用 abort() 来取消客户端的请求,您也无法在服务器端取消它。要做到这一点,即使可以使用 XMLHttpRequest,也需要向服务器发送一个额外的请求,告诉它取消对前面请求的响应。它如何知道要取消哪个响应?您必须管理某种类型的请求 ID。您必须能够适应无序取消请求。复杂的。
因此,这里有一个想法(我只是大声思考):Microsoft 的 XMLHttpRequest 至少在精神上基于 Visual Interdev 时代的更早期的 Microsoft 技术,该技术使用客户端上的 Java 小程序来异步向服务器,然后当响应出现时它将控制权传递给您首选的 JavaScript 回调函数,等等。非常熟悉。
在整个 Sun 与 Microsoft 诉讼惨败期间,Java 异步请求问题就被扭曲了。我听说有传言称,某位微软原任首席执行官一旦得知微软技术是使用 Java 实现的,就会大发雷霆,并杀死该技术。谁知道?当该功能消失了几年时,我很不高兴,但当 XMLHttpRequest 最终出现时,我又很高兴。
也许你知道我要去哪里,在这里......:-)
我想也许您正试图从 XMLHttpRequest 中挤出它不适合的行为。
答案可能是编写您自己的 Java 小程序,进行一些套接字编程,并让它进行您希望从中看到的通信。但是,当然,如果人们的浏览器中没有启用 Java,您就会遇到问题,而最近出现的所有 Java 安全问题又加剧了这一问题。因此,您正在查看代码签名证书等。您还需要考虑需要在服务器端解决的问题。如果您仍然使用 HTTP 并通过 Web 服务器进行工作,则 Web 服务器仍然需要发送 HTTP 响应,这仍然会占用服务器上的资源。您可以使服务器上的这些操作异步,以便 TCP 套接字的占用时间不会超过必要的时间,但您仍然占用服务器端的资源。
使用 XMLHttpRequest 发送异步请求(即您不关心它是否成功或响应是什么:
var req = new XMLHttpRequest();
req.open('GET', 'http://my.url.goes.here.com');
req.send();
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您也可以对 Image 对象做同样的事情:
new Image().src = 'http://my.url.goes.here.com';
Run Code Online (Sandbox Code Playgroud)
如果您发出跨域请求,图像方法尤其有效,因为图像不像 XHR 请求那样受到同源安全限制。(顺便说一句,让端点返回具有适当内容类型的 1x1 像素 PNG 或 GIF 响应是一种很好的做法,但不是必需的,以避免浏览器控制台警告,例如“资源解释为图像,但使用 MIME 类型 text/html 传输”。)
归档时间: |
|
查看次数: |
2351 次 |
最近记录: |