AJAX发射并忘记,寻找与服务器发送的事件相反的情况

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消息的往返期间都有一个挂起的连接是不可接受的.

Dha*_*ang 5

正如您所问的“如何告诉浏览器它不需要等待回复?” 我假设您不想处理服务器回复。

在这种情况下,最好使用 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

如何创建和实现像素跟踪代码

他们再次使用相同的像素图像技术。


Cra*_*aig 5

因此,需要明确的是,您正在尝试使用 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 套接字的占用时间不会超过必要的时间,但您仍然占用服务器端的资源。


bro*_*ofa 0

使用 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 传输”。)