Encadeando promessas (aplicativos do Tempo de Execução do Windows em JavaScript e HTML)

Applies to Windows and Windows Phone

É possível encadear as promessas de várias maneiras. È possível encadear as operações de promessa chamando then ou done na promessa que é retornada pela função do then anterior. Também é possível acompanhar o andamento de uma operação e tratar os erros nas diferentes funções que você transmite como parâmetros para then ou done.

Use then em um estágio intermediário da operação (por exemplo .then().then()) e done no estágio final da operação (por exemplo .then().then().done()). As diferenças entre then e done são as seguintes:

  • É possível encadear várias funções do then, porque o then retorna uma promessa. Não é possível encadear mais de um método do done, porque ele retorna undefined.

  • Se você não forneceu um manipulador de erros para o done e a operação apresentou um erro, uma exceção é lançada para o loop de eventos. Isso significa que você não pode capturar a exceção dentro de um bloco do try/catch, mas pode capturá-la em window.onerror. Se você não forneceu um manipulador de erros para o then e a operação apresentou um erro, ele não lança uma exceção mas retorna uma promessa no estado de erro.

  • Dê preferência aos encadeamentos de promessas planos em vez dos aninhados. A formatação dos encadeamentos de promessas os torna mais fáceis de ler. É muito mais fácil tratar os erros em encadeamentos de promessas.

    Faça o seguinte:

    
    aAsync()
        .then(function () { return bAsync(); })
        .then(function () { return cAsync(); })
        .done(function () { finish(); });
    
    
    

    Não faça o seguinte:

    
    
    // Bad code!
    aAsync().then(function () {
        bAsync().then(function () {
                cAsync().done(function () { finish(); });
        })
    });
    
    
    

Os exemplos abaixo encadeiam os métodos do Tempo de Execução do Windows que retornam promessas, mas também é possível encadear as promessas da Biblioteca do Windows para JavaScript.

Encadeando funções assíncronas

O exemplo a seguir mostra como baixar uma página da Web para um arquivo usando dois métodos assíncronos, createFileAsync e startAsync, usando funções encadeadas do then.

Neste exemplo, a primeira função do then obtém o resultado e o passa para a função do manipulador de conclusão. O BackgroundDownloader cria a operação de download, e o método startAsync inicia o download.

O método startAsync retorna uma promessa e, assim, você pode encadear uma segunda função do then retornando o valor do método startAsync no primeiro manipulador de conclusão. Na segunda função do then, adicione um manipulador de conclusão cujo parâmetro contém a operação de download.



WinJS.Utilities.startLog();

// Assign the URI to download from.
var uriExample = new Windows.Foundation.Uri("http://www.microsoft.com");

// Get the folder for temporary files.
var tempFolder = Windows.Storage.ApplicationData.current.temporaryFolder;

// Create the temp file asynchronously.
tempFolder.createFileAsync("tempfile.txt", Windows.Storage.CreationCollisionOption.replaceExisting)
    .then(function (tempFile) {
        // The createFileAsync call succeeded, so start the download operation.
        var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader();
        var transfer = downloader.createDownload(uriExample, tempFile);
        return transfer.startAsync(); 
    })
    .then(
        //Define the function to use when the download completes successfully
        function (result) {
            WinJS.log && WinJS.log("File download complete");
        });


Acompanhamento de progresso e tratamento de erros

Para acompanhar o progresso de uma operação assíncrona, forneça uma função de progresso. E para obter informações detalhadas sobre as condições do erro, forneça uma função de erro. Use then ou done para atribuir as funções do manipulador a notificações de progresso e tratamento de erros.

O exemplo a seguir mostra como baixar uma página da Web de forma assíncrona para um arquivo usando a função do startAsync com manipuladores de progresso e de erro.



 // Assign the URI to download from.
var uriExample = new Windows.Foundation.Uri("http://www.microsoft.com");

// Get the folder for temporary files.
var tempFolder = Windows.Storage.ApplicationData.current.temporaryFolder;

// Create the temp file asynchronously.
tempFolder.createFileAsync("tempfile.txt", Windows.Storage.CreationCollisionOption.replaceExisting)
   .then(function (tempFile) {
       // The createFileAsync call succeeded, so start the download operation.
       var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader();
       var transfer = downloader.createDownload(uriExample, tempFile);
        return transfer.startAsync(); 
   })
   .then(
       //Define the function to use when the download completes successfully
       function (result) {
           WinJS.log && WinJS.log("File download complete");
       },
       // Define the error handling function.
       function (err) {
           WinJS.log && WinJS.log("File download failed.");
       },
       // Define the progress handling function.
       function (progress) {
           WinJS.log && WinJS.log("Bytes retrieved: " + progress.progress.bytesReceived);
       });


Quando a função do startAsync têm atualizações a serem relatadas, ela chama o manipulador de progresso com os objetos de progresso e de resultado intermediário. Quando um erro ocorre durante a operação assíncrona, o manipulador de erros é chamado em vez do manipulador de conclusão.

Tópicos relacionados

Programação assíncrona em JavaScript

 

 

Mostrar:
© 2014 Microsoft