通过异步请求的方式并发,发送多个 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 ; 取消注释如果想在所有请求完成后退出应用
}
}
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)