Meteorologia: Usando bibliotecas síncronas - wrapAsync e bindEnvironment

###Whats Meteor.wrapAsync e Meteor.bindEnvironment?

Na Parte 1, vimos como o Meteoros abstraiu código assíncrono usando Fibras e forneceu uma maneira fácil de escrever JS em um estilo síncrono. Na Parte 2, entendemos como trabalhar com bibliotecas assíncronas puramente assíncronas

Usando Fibers podemos modificar uma função assíncrona, para escrever código síncrono como código. Contudo, o que acontece quando não podemos modificar a função, como no caso de bibliotecas de terceiros?

No ShareThis, nossa aplicação Meteorologia usa o S3 da Amazon como cache e camada de armazenamento de dados. A partir da documentação do Amazon S3, a assinatura do método JavaScript para adicionar a um balde S3 se parece com

“`

getObject(params = {}, calllback) ⇒ AWS.Request

//This is how the function would look in Meteor server code

    S3.putObject({\i1}

    Balde: "Sharethis-insights-store",

    Chave : chave,

    Corpo : dados

    }, function(err, result){

    if(resultado){

      console.log("Feito");

      //optionally pass in callback

    }

    });

“`

O código acima não funcionará como esperado, pois a chamada de retorno ao S3.putObject não está vinculada à Fibra atual.

Neste caso de uso, usamos Meteor.wrapAsync e para embrulhar a função assíncrona na fibra atual

###O que é que o Meteor.wrapAsync faz?

Meteor.wrapAsync toma o método que você dá como o primeiro parâmetro e o executa na fibra atual.

Também lhe liga uma callback (assume o estilo tradicional do nó de utilizar uma callback, ou seja, o método toma como parâmetro final uma callback com dois argumentos(erro e resultado) dos quais um ou outro será nulo dependendo do resultado da chamada

A callback é ligada com Meteor.bindEnvironment e bloqueia a fibra atual até que a callback seja disparada. Assim que a callback dispara, ela retorna o resultado ou lança o erro.

"javascript

função synchronousFunc(){

retornar Meteor.wrapAsync(asyncFunction)

}

“`

**Como acedemos ao objecto de erro usando as funções de embrulho síncrono devolvidas pelo Meteor.wrapAsync ?**

Um método é usar blocos de tentativa/captura, porque em caso de erro, ele será lançado pela função de sincronização em vez de ser passado como primeiro argumento da função de chamada de retorno da função async.

”`

tentar{

var result=synchronousFunc(params);

console.log("Sucesso :",resultado);

}

catch(error){

console.log("Erro:",erro);

}

// which is equivalent to –

asyncFunction(params,function(erro,resultado){

se(erro)

    console.log("erro", erro);

além disso

    console.log("resultado :",resultado);

});

“`

Isto é ótimo para converter código assíncrono em código síncrono, pois você pode usar o resultado do método na linha seguinte em vez de usar uma callback e/ou encaixar funções mais profundas. Ele até mesmo se encarrega de ligar a callback para a fibra atual (usando Meteor.bindEnvironment) para você.

Uma última nota, se você quiser que a ligação para a função de biblioteca assíncrona faça algo mais (só porque) você tem que usar o Meteor.bindEnvironment explicitamente ou então você recebe um erro informando que o código do Meteor deve sempre ser executado dentro de uma Fibra.

”`

var func = function(cb){

    S3.putObject(params, Meteor.bindEnvironment(function(err, data) {\i1}

      se (err){

       lançar novo Meteor.Error("Storage on S3 Failed");

      } else{

        console.log("Dados armazenados com sucesso no S3");

          cb(nulo, dados);

    }

    }));

 };

return (Meteor.wrapAsync(func))();

“`

Poucos Gotchas de que você precisa estar ciente ao usar Meteor.wrapAsync

Destina-se a trabalhar com funções puramente assíncronas que esperam uma chamada de retorno com erro e resultado como argumentos. Além disso, eles só funcionam no lado do servidor (já que você não pode usar Fibras no lado do cliente)

Métodos do lado do servidor como o Meteor.HTTP.call já estão embrulhados desta forma. Se você chamar sem uma chamada de retorno, o método será bloqueado até que a resposta seja recebida. Caso contrário, ele retornará imediatamente e então executará a chamada de retorno assim que a resposta da rede for recebida.

Sobre ShareThis

ShareThis has unlocked the power of global digital behavior by synthesizing social share, interest, and intent data since 2007. Impulsionado pelo comportamento do consumidor em mais de três milhões de domínios globais, ShareThis observa acções em tempo real de pessoas reais em destinos digitais reais.

Subscreva a nossa Newsletter

Receba as últimas notícias, dicas e actualizações

Assine

Conteúdo relacionado