通过异步请求的方式并发,发送多个 HTTP 请求,支持超时处理,并能够在所有请求完成时发出提示。通过回调函数,你可以灵活地处理每个请求的响应。它还会定期检查请求是否已经完成,完成后弹出提示框。

对效率有绝对追求可以研究一下

 

发送多个异步请求获得返回.ahk

#Persistent
SetBatchLines -1

; 创建全局对象来存储请求,使用URL作为键
Global Requests := {}, TimeoutTimers := {} ; 存储超时计时器

; 示例:发送多个异步请求
SendAsyncRequest("https://www.autohotkey.com/download/1.1/version.txt") ; 超时时间默认10秒
SendAsyncRequest("https://api.github.com/zen")
SendAsyncRequest("https://httpbin.org/get")

; 使用自定义回调发送请求
SendAsyncRequest("https://httpbin.org/uuid", Func("CustomCallback"))

; 指定超时时间的请求示例
; SendAsyncRequest("http://192.168.85.129:18000/", Func("CustomCallback"), 2000) ; 无效网址测试超时


F1::MsgBox % Requests["https://www.autohotkey.com/download/1.1/version.txt"].responseText

; 自定义回调示例,现在接受URL作为参数
CustomCallback(url) {
  req := Requests[url]

  if (req.readyState != 4)
    Return

  ; 清除超时计时器
  if (TimeoutTimers[url]) {
    _ := TimeoutTimers[url]
    SetTimer, % _, Delete
    TimeoutTimers.Delete(url)
  }

  if (req.status == 200)
    SetBatchLines -1
    ; MsgBox % "请求 URL: " url " 自定义回调 callback: " req.responseText
; 	else
; 		MsgBox 16,, % "自定义回调失败。状态:" req.status

  CheckAllRequestsCompleted()
}

; 函数:创建并发送新的异步请求,超时时间默认10秒
SendAsyncRequest(url, callback:="", timeout:=10000) {
  ; 创建新的请求对象
  req := ComObjCreate("Msxml2.XMLHTTP")

  ; 打开启用异步的请求
  req.open("GET", url, true)

  ; 如果没有提供回调函数,使用默认的Ready函数
  if (callback = "")
    callback := Func("Ready").Bind(url) ; 绑定URL到回调函数
  else
    callback := callback.Bind(url) ; 绑定URL到自定义回调函数

  ; 设置回调函数
  req.onreadystatechange := callback

  ; 将请求对象添加到字典,使用URL作为键
  Requests[url] := req

  ; 创建超时处理
  timeoutFunc := Func("HandleTimeout").Bind(url)
  TimeoutTimers[url] := timeoutFunc
  SetTimer, % timeoutFunc, % "-" timeout

  ; 发送请求
  req.send()

  ; 返回URL,以便稍后可以引用此请求
  Return url
}

; 处理请求超时
HandleTimeout(url) {
  ; 检查请求是否已经完成
  req := Requests[url]
  if (!req || req.readyState == 4)
    Return

  ; 中止请求
  req.abort()
  
  ; 移除超时计时器
  TimeoutTimers.Delete(url)

  ; MsgBox 16,, % "请求 URL: " url " 超时。"
}

; 默认回调函数,现在接受URL作为参数
Ready(url) {
  ; 使用传入的URL获取请求对象
  req := Requests[url]

  if (req.readyState != 4)  ; 没有完成
    Return

  ; 清除超时计时器
  if (TimeoutTimers[url]) {
    _ := TimeoutTimers[url]
    SetTimer, % _, Delete
    TimeoutTimers.Delete(url)
  }

  if (req.status == 200) ; 完成
    ; MsgBox % "请求 URL: " url " 完成。答复:" req.responseText
    SetBatchLines -1
  else
    MsgBox 16,, % "请求 URL: " url " 失败。状态:" req.status

  CheckAllRequestsCompleted()
}

; 检查是否所有请求都已完成
CheckAllRequestsCompleted() {
  completedCount := 0
  For url, req in Requests
    if (req.readyState == 4)
      completedCount++

  if (completedCount >= Requests.Count()) {
    ; 所有请求都已完成
    MsgBox % "所有 " completedCount " 个请求已完成。"
    ; ExitApp ; 取消注释如果想在所有请求完成后退出应用
  }
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。