Skip to content

Promises experimental

The Promise struct is used to represent the eventual completion (or failure) of an asynchronous operation and its resulting value.
This struct provides methods to handle asynchronous operations in a standardized way, allowing chaining and composition of promises.

Public Methods

Wait

Synchronously waits for the promise to complete.

vein
promiseInstance.Wait();

TryWait

Attempts to wait for the promise to complete within the specified TimeSpan. Returns true if the promise is resolved within the time, otherwise returns false.

vein
auto result = promiseInstance.TryWait(someTimeSpan);

Finally

Adds a handler to be called when the promise is settled, regardless of its outcome (either resolved or rejected).

vein
promiseInstance.Finally(() |> {
    // Cleanup or finalization code here
});

Then

Adds a handler to be called when the promise is resolved.

vein
promiseInstance.Then(() |> {
    // Code to handle resolved promise
});

Catch

Adds a handler to be called when the promise is rejected.

vein
promiseInstance.Catch((error) |> {
    // Code to handle rejected promise
});

WaitAll

Synchronously waits for all the promises in the provided list to complete.

vein
Promise.WaitAll([promise1, promise2, promise3]);

WaitAny

Synchronously waits for any one of the promises in the provided list to complete.

vein
Promise.WaitAny([promise1, promise2, promise3]);

WhenAll

Returns a list of promises that complete when all the promises in the provided list have completed.

vein
auto completedPromises = Promise.WhenAll([promise1, promise2, promise3]);

WhenAny

Returns a promise that completes when any one of the promises in the provided list completes.

vein
auto firstCompletedPromise = Promise.WhenAny([promise1, promise2, promise3]);

When

Returns a promise that completes based on a custom predicate applied on the provided list of promises.

vein
auto customCompletedPromise = Promise.When([promise1, promise2, promise3], customPredicate);

Special Methods

The Promise struct also supports usage with the await syntax, allowing for asynchronous promise resolution using the await keyword. This integration allows for more readable and maintainable asynchronous code.

Examples

Basic Usage

Creating and Handling a Promise

vein
auto myPromise = new Promise();

// Handle resolved state
myPromise.Then(() |> {
    Out.print("Promise resolved successfully.");
});

// Handle rejected state
myPromise.Catch((error) |> {
    console.error("Promise rejected with error:", error);
});

// Add a finalization handler
myPromise.Finally(() |> {
    Out.print("Promise settled (either resolved or rejected).");
});

Wait for All Promises to Complete

vein
Promise.WaitAll([promise1, promise2, promise3]);
Out.print("All promises have been resolved.");

Wait for Any Promise to Complete

vein
Promise.WaitAny([promise1, promise2, promise3]);
Out.print("At least one of the promises has resolved.");

Using await with Promises

vein
async asyncFunction(): IshtarTask {
    await promiseInstance;
    Out.print("Promise resolved using await.");
}

Conclusion

The Promise struct provides a powerful and flexible way to handle asynchronous operations in a structured manner. By leveraging its methods, you can manage complex asynchronous workflows with ease, ensuring code readability and maintainability.