Windows 8 adventures: error handling and the async pattern

In the previous post, we’ve started looking at the async pattern in Windows 8 Metro apps developed with JavaScript. By now, you know that all async operations are wrapped in Promise objects which you can use to be notified when that operation has ended (besides other interesting things!). We’ve also seen how we can “improve” the code readability associated with several async operations which are executed in chain.

What I didn’t mention at the time is that the then method expects three parameters (all functions). Besides the success function, you can also pass two other functions which will be called, respectively, for reporting an error and for reporting progress. If you follow my previous advice and return new Promises from the then method, then you can get “global” error handling by adding a final then method which defines the global method function. Here’s an improved version of the createFolderAndFile function:

function createFolderAndFile() {
    //create new folder inside temp folder
    var tempFolder = Windows.Storage.ApplicationData.current.temporaryFolder;
    tempFolder.createFolderAsync("testFolder",
    Windows.Storage.CreationCollisionOption.openIfExists)
    .then(function (folder) {
        return folder.createFileAsync("testFile.txt")
    })
    .then( function (file) {
        return file.openAsync( Windows.Storage.FileAccessMode.readWrite);
    })
    .then( function (dataStream) {
        var stream = dataStream.getOutputStreamAt(0);
        var writer = new Windows.Storage.Streams.DataWriter(stream);
        writer.writeString("Howdy, there!");
        return writer.storeAsync()
        .then(function () {
            return stream.flushAsync()
            .then(function () {}, function () { }); }); })
    .then(null, function (err) { //handle error here! });;
    }

Notice that there’s a slight change and we’re returning the result of the storeAsync().then call so that all eventual errors can be handled in the error function passed to the last then method call. You can test this behaviour by adding throw statements in several places in the previous code and by setting a breakpoint inside that anonymous error function.

And that’s all for now. Stay tuned for more.

Advertisements

~ by Luis Abreu on January 20, 2012.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: