ZetCode

VBScript readyState Property

last modified April 9, 2025

The readyState property in VBScript is used with XMLHTTP objects to track the state of HTTP requests. It returns a numeric value indicating the current state of the request. This property is essential for asynchronous operations where you need to monitor request progress.

readyState has five possible values from 0 to 4, each representing a different stage. It's commonly used with the onreadystatechange event handler. This tutorial covers readyState with practical examples to demonstrate its usage.

readyState Property Overview

The readyState property indicates the current state of an XMLHTTP request. The values range from 0 (UNSENT) to 4 (DONE). Each value represents a specific stage in the request lifecycle. Understanding these states is crucial for proper request handling.

State 0 means the request isn't initialized. State 1 means the connection is established. State 2 means the request is received. State 3 means processing. State 4 means the operation is complete. These states help track asynchronous request progress.

Basic readyState Monitoring

This example demonstrates basic monitoring of the readyState property. It shows how to check the state during an HTTP request. The script makes a simple GET request and logs state changes.

basic_readystate.vbs
Set xmlhttp = CreateObject("MSXML2.XMLHTTP")
xmlhttp.Open "GET", "https://example.com", False
xmlhttp.Send

WScript.Echo "ReadyState: " & xmlhttp.readyState
WScript.Echo "Status: " & xmlhttp.status

Set xmlhttp = Nothing

The script creates an XMLHTTP object and makes a synchronous request. The readyState is checked after sending the request. For synchronous requests, the state will be 4 (complete) when execution continues.

Asynchronous Request with State Tracking

This example shows how to track readyState changes in an asynchronous request. It uses the onreadystatechange event to monitor progress. Each state change triggers the event handler.

async_readystate.vbs
Set xmlhttp = CreateObject("MSXML2.XMLHTTP")

Sub OnReadyStateChange
    WScript.Echo "State changed to: " & xmlhttp.readyState
    If xmlhttp.readyState = 4 Then
        WScript.Echo "Request completed with status: " & xmlhttp.status
    End If
End Sub

xmlhttp.onreadystatechange = GetRef("OnReadyStateChange")
xmlhttp.Open "GET", "https://example.com", True
xmlhttp.Send

' Keep script running while request completes
Do While xmlhttp.readyState <> 4
    WScript.Sleep 100
Loop

Set xmlhttp = Nothing

The script creates an asynchronous request and defines an event handler. The handler logs each state change. The loop ensures the script waits for completion. This pattern is common for asynchronous operations.

Handling Different readyState Values

This example demonstrates handling all possible readyState values. It shows how to perform different actions based on the current state. Each state triggers specific processing.

state_handling.vbs
Set xmlhttp = CreateObject("MSXML2.XMLHTTP")

Sub StateHandler
    Select Case xmlhttp.readyState
        Case 0: WScript.Echo "Request not initialized"
        Case 1: WScript.Echo "Server connection established"
        Case 2: WScript.Echo "Request received"
        Case 3: WScript.Echo "Processing request"
        Case 4: 
            WScript.Echo "Request finished"
            If xmlhttp.status = 200 Then
                WScript.Echo "Response: " & xmlhttp.responseText
            End If
    End Select
End Sub

xmlhttp.onreadystatechange = GetRef("StateHandler")
xmlhttp.Open "GET", "https://example.com", True
xmlhttp.Send

Do While xmlhttp.readyState <> 4
    WScript.Sleep 100
Loop

Set xmlhttp = Nothing

The script uses a Select Case structure to handle each state. State 4 includes additional status checking. This approach provides fine-grained control over request processing. It's useful for complex operations.

Error Handling with readyState

This example demonstrates error handling using readyState and status codes. It shows how to detect and respond to request failures. Proper error handling makes scripts more robust.

error_handling.vbs
Set xmlhttp = CreateObject("MSXML2.XMLHTTP")

Sub ErrorHandler
    If xmlhttp.readyState = 4 Then
        If xmlhttp.status = 200 Then
            WScript.Echo "Success: " & xmlhttp.responseText
        Else
            WScript.Echo "Error: " & xmlhttp.status & " - " & xmlhttp.statusText
        End If
    End If
End Sub

xmlhttp.onreadystatechange = GetRef("ErrorHandler")
xmlhttp.Open "GET", "https://example.com/nonexistent", True
xmlhttp.Send

Do While xmlhttp.readyState <> 4
    WScript.Sleep 100
Loop

Set xmlhttp = Nothing

The script checks both readyState and status for error handling. Only when the request is complete (state 4) does it evaluate the status. This pattern ensures proper error detection after request completion.

File Download with Progress Tracking

This example shows how to use readyState to track file download progress. It demonstrates intermediate processing during state 3. The script downloads a file while reporting progress.

download_progress.vbs
Set xmlhttp = CreateObject("MSXML2.XMLHTTP")

Sub ProgressHandler
    If xmlhttp.readyState = 3 Then
        WScript.Echo "Download in progress..."
    ElseIf xmlhttp.readyState = 4 Then
        If xmlhttp.status = 200 Then
            Set fso = CreateObject("Scripting.FileSystemObject")
            Set file = fso.CreateTextFile("downloaded_file.html", True)
            file.Write xmlhttp.responseText
            file.Close
            WScript.Echo "File downloaded successfully"
        End If
    End If
End Sub

xmlhttp.onreadystatechange = GetRef("ProgressHandler")
xmlhttp.Open "GET", "https://example.com", True
xmlhttp.Send

Do While xmlhttp.readyState <> 4
    WScript.Sleep 100
Loop

Set xmlhttp = Nothing

The script uses state 3 to indicate download progress. Upon completion (state 4), it saves the response to a file. This demonstrates practical use of intermediate states. The approach works well for large file downloads.

Source

XMLHTTP Documentation

In this article, we have explored the readyState property in VBScript, covering its usage and practical applications. From basic state monitoring to complex download tracking, these examples demonstrate request state management. With this knowledge, you can enhance your HTTP operations with robust state handling.

Author

My name is Jan Bodnar and I am a passionate programmer with many years of programming experience. I have been writing programming articles since 2007. So far, I have written over 1400 articles and 8 e-books. I have over eight years of experience in teaching programming.

List all VBScript tutorials.