Programação assíncrona em JavaScript (aplicativos do Tempo de Execução do Windows em JavaScript e HTML)

Applies to Windows and Windows Phone

JavaScript é uma linguagem tipo single thread. Isso significa que invocar um processo de execução longa bloqueia todas as execuções até que esse processo seja concluído. Os elementos da interface do usuário não respondem, as animações são pausadas e não é possível executar nenhum outro código do aplicativo. A solução para esse problema é evitar a execução síncrona o máximo possível.

Uma forma de fazer isso é fazer com que uma função seja executada posteriormente, como acontece com os identificadores de evento, que são invocados depois que outra chamada executar um evento. As funções de retorno de chamada são outro tipo de processamento assíncrono, pois elas retornam a chamada para o código que iniciou o processo.

Problemas ao usar a programação assíncrona

A programação assíncrona pode se tornar complicada rapidamente. Muitas das APIs JavaScript padrão dependem significativamente de retornos de chamada, que são frequentemente aninhados, o que os torna difíceis de depurar. Além disso, o uso de funções embutidas anônimas pode tornar problemática a leitura da pilha de chamadas. Exceções geradas de dentro de um conjunto de retornos de chamada altamente aninhados podem não ser propagadas até a função que iniciou a cadeia. Isso torna difícil determinar onde exatamente o bug está localizado.

Programação assíncrona em aplicativos do Tempo de Execução do Windows em JavaScript

O Tempo de Execução do Windows e a Biblioteca do Windows para JavaScript oferecem uma forma de superar esses problemas, implementando a proposta Common JS Promises/A. Um objeto de promessa retorna um valor em algum momento futuro. Você pode usar esses objetos para construir cadeias de código assíncrono, que são mais fáceis de ler.

Todas as APIs do Tempo de Execução do Windows expostas aos aplicativos da Windows Store são encapsuladas em objetos de promessa. Assim, você usa as APIs do Tempo de Execução do Windows como achar melhor. As promessas de WinJS são importantes porque muitas interações com o Tempo de Execução do Windows são assíncronas.

Promessas explicadas

Uma promessa é um objeto. O método usado com mais frequência em um objeto de promessa é o then, que utiliza três parâmetros: uma função de chamada para quando a promessa for concluída com êxito, uma função de chamada para quando a promessa for concluída com erro e uma função para fornecer informações de progresso. Tanto no Tempo de Execução do Windows quanto na WinJS, também é possível usar a função done, que utiliza os mesmos três parâmetros. A diferença é que, caso ocorra um erro de processamento, a função then retorna uma promessa no estado de erro, mas não gera uma exceção, enquanto o método done gera uma exceção se uma função de erro não for fornecida.

Vejamos um exemplo básico de uma promessa com dois métodos assíncronos (fictícios): um para chamar um serviço Web e outro para armazenar os resultados em um banco de dados.


myWebService.get("http://www.example.com")
    .then(function(result) { 
        return myDb.add(result); 
    })
    .then(function() {
        console.log('data successfully saved');
    }, function(error) {
        console.log('an error occurred while saving:');
        console.dir(error);
    });


Você acrescenta a função then ao método myWebService.get. Como esse método retorna uma promessa, você pode acrescentar uma segunda função then ao método myDb.add e tratar de qualquer erro na função de erro passada à segunda função then.

Você também pode agrupar diversas promessas. Por exemplo, é possível usar a função join para executar diferentes operações assíncronas que chamam vários serviços Web e depois agregam os resultados.


function loadData() {
    var urls = [
        'http://www.example.com/',
        'http://www.example.org/',
        'http://www.example.net'
        ];
        
    var promises = urls.map(function (url) {
        return myWebService.get(url);
    });

    WinJS.Promise.join(promises).then(function () {
        //do the aggregation here.
    });
}


Primeiro, criamos uma matriz de URLs. Em segura, usamos a função Array.map para converter essa matriz de URLs em uma matriz de promessas, pois mywebService.get retorna uma promessa. Por fim, usamos a função de junção, que aceita uma matriz de promessas e retorna uma nova promessa após a conclusão de todas as promessas. Agregamos os dados dentro da função completa do método then.

Tópicos relacionados

Início rápido: usando promessas
Como manipular erros com promessas
Solucionando problemas de erros de WinRT
Encadeando promessas
Manipulando várias promessas

 

 

Mostrar:
© 2014 Microsoft