Parameter
Description
A function that returns a Future object. For more information, see Asynchronous programming in ColdFusion.
Returns
A Future object.
Syntax
RunAsync() RunAsync(UDFMethod function) RunAsync(UDFMethod function, long timeOut)
History
New in ColdFusion (2018 release).
Parameters
|
Required/Optional |
Description |
---|---|---|
function |
Optional |
Closure function that returns a Future object, which holds the result of execution, status, and so on. |
timeOut |
Optional |
Timeout in milliseconds. |
Example 1
<cfscript> //To run a function asynchronously and get the result future = runAsync(function(){ return "Hello World!"; }); result = future; writeOutput(result.get()); </cfscript>
Example 2
In this example, you'll see how we chain two methods, display a result.
<cfscript> // Define a function to fetch the response from a URL function fetchResponseFromURL(url) { result = ""; httpService = new http(method = "GET", charset = "utf-8", url = url); httpService.addParam(name = "q", type = "url", value = "cfml"); result = httpService.send().getPrefix(); writeDump(result); return result; } // once the response is fetched, do the processing (here we just deserialize the json) future = runAsync(function(){ return fetchResponseFromUrl("http://date.jsontest.com/"); }).then( function(input){ return deserializeJson(input.FileContent) }); result = future.get() writedump(result); </cfscript>
Output
Example 3
In this example, you'll see a non-blocking scenario where we've defined asynchronous functions to send email and SMS.
<cfscript> // Define an asynchronous function to send an email function sendEmailAsync(toAddress, subject, body) { cfmail(to=toAddress, subject=subject, body=body, type="html"); } // Define an asynchronous function to send an SMS function sendSmsAsync(phoneNumber, message) { // Replace the following line with your actual SMS sending logic // Example: sendSmsFunction(phoneNumber, message); } // List of recipients with real-world-like data recipients = [ { email: "recipient1@example.com", phone: "1234567890", subject: "Subject 1", body: "Body 1" }, { email: "recipient2@example.com", phone: "0987654321", subject: "Subject 2", body: "Body 2" }, { email: "recipient3@example.com", phone: "5555555555", subject: "Subject 3", body: "Body 3" }, { email: "recipient4@example.com", phone: "6666666666", subject: "Subject 4", body: "Body 4" }, { email: "recipient5@example.com", phone: "7777777777", subject: "Subject 5", body: "Body 5" }, { email: "recipient6@example.com", phone: "8888888888", subject: "Subject 6", body: "Body 6" }, { email: "recipient7@example.com", phone: "9999999999", subject: "Subject 7", body: "Body 7" }, { email: "recipient8@example.com", phone: "1010101010", subject: "Subject 8", body: "Body 8" }, { email: "recipient9@example.com", phone: "2020202020", subject: "Subject 9", body: "Body 9" }, { email: "recipient10@example.com", phone: "3030303030", subject: "Subject 10", body: "Body 10" } ]; // Start the email sending process asynchronously for each recipient for (var i = 1; i <= arrayLen(recipients); i++) { var recipient = recipients[i]; runAsync(function() { sendEmailAsync(recipient.email, recipient.subject, recipient.body); }); } // Start the SMS sending process asynchronously for each recipient for (var i = 1; i <= arrayLen(recipients); i++) { var recipient = recipients[i]; runAsync(function() { sendSmsAsync(recipient.phone, "SMS message content"); }); } // The following code will execute immediately without waiting for the email and SMS sending processes to complete writeOutput("In main thread...<br>"); </cfscript>
Example 4
In this example, you'll learn to use parallel processing using runAsync, where you'll generate the first 100000 Fibonacci numbers, and also perform a matrix multiplication.
<cfscript> //Task 1 fibonacciTask = runAsync(function(){ // Generate first 10000000 Fibonacci numbers fib = [0, 1]; for (var i = 3; i < 10000000; i++) { fib[i] = fib[i-1] + fib[i-2]; } return fib; }); // Task 2 matrixMultiplicationTask = runAsync(function(){ var matrix1 = []; var matrix2 = []; var result = []; // Generate random matrices (for simplicity, let's assume values are between 1 and 10) for (var i = 1; i <= 200; i++) { matrix1[i] = []; matrix2[i] = []; result[i] = []; for (var j = 1; j <= 200; j++) { matrix1[i][j] = randRange(1, 10); matrix2[i][j] = randRange(1, 10); } } // Multiply matrices for (var i = 1; i <= 200; i++) { for (var j = 1; j <= 200; j++) { result[i][j] = 0; for (var k = 1; k <= 200; k++) { result[i][j] = result[i][j] + matrix1[i][k] * matrix2[k][j]; } } } return result; }); //Task 3 sleepingTask = runAsync(function(){ sleep(9000); }); writedump(fibonacciTask.get()); writedump(matrixMultiplicationTask.get()); writedump(sleepingTask.get()); </cfscript>
Example 5
In this example, you'll learn to use parallel processing using runAsync, where you'll check if a number is prime, calculate the sum of the prime numbers, and start multiple asynchronous tasks to calculate the sum of prime numbers in parallel.
<cfscript> // Function to check if a number is prime function isPrime(num) { if (num <= 1) return false; if (num <= 3) return true; if (num MOD 2 EQ 0 OR num MOD 3 EQ 0) return false; var i = 5; while (i * i <= num) { if (num MOD i EQ 0 OR num MOD (i + 2) EQ 0) return false; i = i + 6; } return true; } // Function to calculate the sum of prime numbers function calculatePrimeSum(start, end) { var sum = 0; for (var i = start; i <= end; i++) { if (isPrime(i)) { sum = sum + i; } } return sum; } // Define the range for prime number calculation startRange = 1; endRange = 10000; // Start multiple asynchronous tasks to calculate the sum of prime numbers in parallel task1Id = runAsync(function() { result1 = calculatePrimeSum(startRange, 2500); return result1; }); task2Id = runAsync(function() { result2 = calculatePrimeSum(2501, 5000); return result2; }); task3Id = runAsync(function() { result3 = calculatePrimeSum(5001, 7500); return result3; }); task4Id = runAsync(function() { result4 = calculatePrimeSum(7501, endRange); return result4; }); // The following code will execute immediately without waiting for the async tasks to complete writeOutput("In main thread...<br>...<br>"); writeDump(var=task1Id.get(), label="Task 1 ID"); writeDump(var=task2Id.get(), label="Task 2 ID"); writeDump(var=task3Id.get(), label="Task 3 ID"); writeDump(var=task4Id.get(), label="Task 4 ID"); </cfscript>
Output
In main thread...
...
420812 1127324 1749901 2438359