2016-08-24 76 views
1

我已经制作了这个方便的VBA函数,该函数使用MSXML2.serverXMLHTTP对象返回给定URL的HTTP状态。这个函数是同步执行的,我的代码的其余部分冻结,直到请求被解析。如何将它变成异步调用?VBA使用HTTP进行异步数据呼叫

当前工作功能:

Function page_http_status(url) As String 

      Dim XMLHTTP As Object 

      Set XMLHTTP = CreateObject("MSXML2.serverXMLHTTP") 
      XMLHTTP.Open "GET", url, False 
      XMLHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
      XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0" 

      XMLHTTP.send 
      page_http_status = XMLHTTP.Status 

End Function 

onreadystatechange的尝试

我知道有一个XMLHTTP.onreadystatechange事件可以触发一个名为回调函数,但我怎么能触发此函数返回值为page_http_status()

XMLHTTP.onreadystatechange = FunctionReadyStateChange 

然后

Function FunctionReadyStateChange() 

MsgBox ("Request received! " & XMLHTTP.Status) 

End Function 
+0

https://msdn.microsoft.com/en-us/library/ms757849(v=vs.85).aspx - 注意第三个参数。 – user2864740

+0

如果请求异步处理,则函数*不能*根据响应返回字符串,因为请求未完成。 – user2864740

+0

无论如何,你的XMLHTTP将会在事件发生之前超出范围。你应该在函数之外定义'XMLHTTP',也许在模块中定义为'Public'或者别的地方。 –

回答

0

进一步阅读后,我意识到,VBA根本不支持回调函数的开箱。

使用XMLHTTP.onreadystatechange是一个可行的解决方案,但它需要解决2局限性:

1)XMLHTTP将不得不以保持该对象的范围适用于“回调”,公开宣布(这个很好)。

2)原始函数无法返回值,所以我将不得不将输出保存在过程中(而不是返回输出的“标量”函数)。