Node.js Asynchronous Methods that Return Objects
This post shows the general technique to get the object returned by a method when it is called asynchronously. For example, consider the Mailman.GetUidls() method. A synchronous call to GetUidls returns a StringArray object, as shown here:
// sa: StringArray var sa; sa = mailman.GetUidls(); var i; var n = sa.Count; for (i = 0; i <= n - 1; i++) { console.log(sa.GetString(i)); }
However, the async version of the method, GetUidlsAsync, returns a Task object. The TaskCompleted callback is called when finished. The following code snippet shows how to get the StringArray result in the TaskCompleted callback.
function taskCompleted(task) { // A finished/completed task may be one that was canceled, aborted, or truly finished. // If the task was "canceled", it was canceled prior to actually starting. // If the task "completed", then it ran to completion, but the actual success/failure of the method // is determined by the result obtained via one of the GetResult* methods. (A "completed" task will // have a StatusInt equal to 7. If the task finished, but was not completed, then it must've // been aborted or canceled: if (task.StatusInt != 7) { console.log("Task did not complete."); console.log("task status: " + task.Status); return; } // The GetUidls method returns an object (namely a chilkat.StringArray object). // For methods that return an object, to get the returned object we'll create a new/empty // instance of the object, and then load it from the task. // In this case, the returned type of object is a chilkat.StringArray. var sa = new chilkat.StringArray(); // Note: Each Chilkat class that exists as a returned object in some method call // will have a LoadTaskResult method. // For example, chilkat.Xml, chilkat.JsonObject, and chilkat.Email // each have a method named LoadTaskResult because // these are classes that can be returned in a method call. // For example, MailMan.FetchEmail returns a chilkat.Email object. // We call LoadTaskResult to load the object with the contents of the returned object: sa.LoadTaskresult(task); // Now sa contains the UIDLs that were fetched... var i; var n = sa.Count; for (i = 0; i <= n - 1; i++) { console.log(sa.GetString(i)); } } ... var task = mailman.GetUidlsAsync(); if (task == null ) { console.log(mailman.LastErrorText); return; } // … // … // Schedule the task for running on Node's thread pool. This changes the task's state // from Inert to Live. // Pass the taskCompleted function so that it runs asynchronously. // If no arguments are passed to task.Run(), then it runs synchronously (following Node's conventions). success = task.Run(taskCompleted); if (success != true) { console.log(task.LastErrorText); return; } // The application continues while the UIDls are being fetched in one of Node's worker threads.
The General Technique for Getting the Returned Object:
- In the taskCompleted callback, create a new instance of the type of object that would’ve been returned in the synchronous call.
- Load the object with the result by calling object.LoadTaskResult(task);
admin
0
Tags :