0

我们可以使用 URLLoader 从服务器发送 HTTP 请求和监听事件。我的问题是 URLLoader 在哪里以及如何调度 complete、progress、ioError 事件?由于在服务器端,我们不调用 dispatchEvent。

代码如下:

var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, completeHandler);
loader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
loader.load(new URLRequest("http://example/lookup"));

哪个对象调度上述事件,它在哪里调度?

4

2 回答 2

0

它们是由虚拟机触发的,最初它发生在 NPAPI(例如 Gecko API 参考)的浏览器实现或 chrome 中的 PPAPI 的某个地方(我猜,我不确定) 。

于 2013-01-14T12:41:04.623 回答
0

URLLoader通过 HTTP 标头执行此操作。我对 HTTP 标头并不太熟悉,但我确实知道以下内容(来自经验和阅读 LiveDocs):

  • ProgressEvent.PROGRESS只要下载取得了进展,就会定期发送(在 Flash SDK 中预定义)。它不会在下载的每个字节上分派,也没有任何关于它是如何分派的押韵或理由,除了似乎是一个固定的时间间隔
  • ProgressEvent.PROGRESS 事件的bytesTotal属性取自Content-Length标头。如果您在请求中发送 Range 标头,它应该否定响应中的 Content-Length 标头,您会得到 0 bytesTotal。您可以通过侦听HTTPStatusEvent.HTTP_STATUS_RESPONSE、循环标头并找到 Content-Range 标头来解决此问题。您可以使用 RegEx 从该对象中获取长度。
  • ProgressEvent.PROGRESS 事件的bytesLoaded属性在内部处理。URLLoader 将下载的每个字节保存到 aByteArray中,而 bytesLoaded 只是 ByteArray 的length属性
  • 我不确定是如何Event.COMPLETE起火的,但我相信它会在连接断开时发生。
  • IOErrorEvent.IO_ERROR根据 Flash SDK 内部预定义的情况进行调度。最常见的是,它会在发生 404 错误时调度。除此之外,我不确定。

除了在每个请求中发送有效的 HTTP 标头以使这些事件正确触发之外,您不必在服务器端执行任何操作。在大多数情况下,一切都在内部处理。

我强烈建议阅读LiveDocs。它们非常详细,并且仍然以非常有用和信息丰富的方式编写,这对于编码文档来说是非常罕见的

于 2013-01-15T16:09:20.033 回答