Implementando a classe Asynchronous em AjaxTendo determinado XMLHttpRequests assíncronas são o caminho a percorrer, a classe de encapsulamento Asynchronous está definido. Uma classe de encapsulamento não é necessário, mas torna mais simples para trabalhar com o objeto XMLHttpRequest. A principal vantagem de usar uma classe de encapsulamento é a associação do objeto XMLHttpRequest, com um bloco de código. Para relembrar, vamos analisar o código para carregar um feed Atom novamente: LoadAtomFeed function () (var assíncrono = Asynchronous novo (); asynchronous.settings = (onComplete: function (xmlhttp) (parseAtom (xmlhttp.responseXML); flexbox.update ();)) asynchronous.get ( "/ serviços / blog / entradas / current ");)
Para fazer o trabalho de classe assíncrona, o usuário precisa fazer duas coisas: associar o membro de dados de configurações com algumas informações e chamar um método adequado (por exemplo, obter) para fazer uma solicitação HTTP. A finalidade do membro de dados de definições é fornecer a informação extra e callbacks associados a um pedido. No exemplo, o método onComplete é chamado uma vez o pedido de HTTP é concluída. O código como está, é bastante fácil de entender, mas lembre-se que o código é assíncrona. Como resultado, quando o método asynchronous.get é chamado, a função LoadAtomFeed vai sair antes de chamar onComplete e devolver o controle ao usuário. Em um cenário pessimista, se um usuário vai clicar louco, pode haver dezenas de solicitações estão sendo feitas. A alternativa é usar chamadas síncronas, que trava o navegador, e que em si não é uma opção. No lado positivo, o comportamento assíncrono permite que um usuário para iniciar as tarefas e esperar pelos resultados. O programador tem de se manter vigilante e certifique-se que o usuário não começar antes de ele ou ela mesma. Agora que você tem uma compreensão básica de como usar a classe Asynchronous, vamos olhar para os detalhes da implementação assíncrona. A classe expõe um método para cada verbo HTTP, e no exemplo do método get corresponde ao verbo HTTP GET. A implementação de chegar é o seguinte: função HttpRequest_get (strURL) (this.call ((: action "GET", url: strURL));) Na execução do HttpRequest_get, que é mapeado para Asynchronous.get, uma referência para a chamada de função é feita. A função get é um método de conveniência para o método de chamada. A chamada de método aceita um único parâmetro: um objeto com os membros de dados específicos. No caso de o método GET, a ação e os membros url dados são definidos. Então, por que criar um objeto, quando você poderia ter usado dois parâmetros, a ação ea url, para chamar o método? A resposta é a flexibilidade. JavaScript não compreende funções sobrecarregadas, e só pode haver uma única função com um único conjunto de parâmetros. Assim que o desenvolvedor não tem que jogar as permutações e as combinações do jogo com os parâmetros (por exemplo, que os parâmetros, que ordem, etc), um objeto com membros de dados é criado. O método mais importante da chamada assíncrona é, pois, independentemente de qual verbo HTTP é usado, o método é executado. O código a seguir é a implementação completa da chamada. Fonte: Vou agora explicar o método de chamada do começo ao fim, e eu reitero os pedaços de código individual, com algumas reiterações abreviado. Eu mostro o código de novo se for caso disso, para facilitar a compreensão, como a implementação da chamada é relativamente longo, e faz muitas coisas diferentes. Começando pelo topo, a variável de instância é atribuído o valor assim: var exemplo = this; Esta atribuição é necessário porque um bloco de código será atribuído ao membro dados onreadystatechange, eo bloco de código tem de lembrar que Asynchronous instância está sendo referenciada. Após a atribuição, podemos validar que o membro de dados de definições foi preenchido: if (! this.settings) (throw new Error ( "Settings não está definido");) O membro de dados de configurações tem de existir, pois contém informações sobre quais os métodos a ser chamada quando o pedido foi concluída e que os cabeçalhos HTTP para adicionar ao pedido. Nesse ponto, você deve notar que dois objetos são necessários para fazer funcionar o método de chamada. O primeiro objeto é ajustes, eo segundo objeto é o parâmetro de solicitação. Como um atalho, um desenvolvedor pode combinar os dois objetos em um, e quer passá-lo para o método de chamada ou atribuí-lo ao membro de dados de configurações. Este atalho seria equivocada, pois cada objeto tem um propósito diferente. O objeto de pedido é usado para definir as configurações para o pedido de URL específico que está sendo feito. As configurações de objeto é usado para definir as configurações que transcendem todas as chamadas e pode ser considerado um retorno global para a instância do objeto assíncrona. A idéia é que você alocar uma instância de Asynchronous, definir como deve se comportar, e então começar a fazer os pedidos com a possibilidade de chamar URLs diferentes. Então, o próximo passo é verificar se a instância XMLHttpRequest actual já não está preocupado: if (this.xmlhttp.readyState! = 4 & & this.xmlhttp.readyState! = 0) (throw new Error ( "pedido Atualmente ativa não pode continuar");) Ao utilizar XMLHttpRequest no modo assíncrono, é possível fazer uma solicitação HTTP em uma nova instância XMLHttpRequest execução. O problema é que XMLHttpRequest não pode servir a dois pedidos, e vai parar o pedido de execução já para fazer uma nova solicitação. A propriedade readyState é usado para indicar o estado do objeto XMLHttpRequest. Se readyState é 0, então nenhuma solicitação foi feita uma solicitação HTTP e podem ser feitas. Se readyState é 4, em seguida, um pedido foi feito, o pedido foi concluído, eo objeto está pronto para fazer outro pedido. ReadyState Se tiver qualquer outro valor, o pedido está sendo executado, e, portanto, um outro pedido de execução não faz sentido. Após a inicialização e verificação foi concluída, é possível fazer um pedido: this.xmlhttp.open (request.action, solicitar . url, true, this.settings.username, this.settings.password); chamar o método Open, você precisa especificar no verbo aminimum o HTTP (por exemplo, GET, POST), através do membro de dados request.action eo URL via o membro de dados request.url. Sempre que você fizer qualquer solicitação XMLHttpRequest, certifique-se que a primeira ação é o método aberto. Se você atribuir a função antes de chamar onreadystatechange aberto, o seu pedido não irá funcionar corretamente. Se você tentar atribuir cabeçalhos de solicitação antes de chamar aberto, o seu pedido não irá funcionar corretamente. O método aberto é usado para inicializar e criar um novo pedido; aberto não irá chamar o servidor, que é da responsabilidade de enviar. No exemplo de método aberto, um nome de usuário e senha this.settings.username (e this.settings.password, respectivamente) são sempre enviadas para o servidor, mesmo se não houver nenhum nome de usuário e senha. Não faz nenhum dano para enviar valores nulos, e que não irá afectar o funcionamento de uma solicitação HTTP. O nome de usuário ea senha são usados somente quando o servidor HTTP executa um desafio e pede um username e password. No contexto do objeto XMLHttpRequest, o nome de usuário ea senha são usados somente se a implementação subjacente de XMLHttpRequest necessita da informação. Depois de ter aberto o pedido, você pode adicionar cabeçalhos HTTP personalizados usando o método setRequestHeaders: if (Request.Headers) (for (defHeader em Request.Headers) (this.xmlhttp.setRequestHeader (defHeader, Request.Headers [defHeader]);)) if (this.settings.headers) (for (defHeader em this.settings . headers) (this.xmlhttp.setRequestHeader (defHeader, this.settings.headers [defHeader]);)) Os cabeçalhos são atribuídas duas vezes: uma vez para que as configurações associadas com o pedido (Request.Headers) e uma vez para as configurações globais (this.settings.headers). Os cabeçalhos que você atribuir cabeçalhos podem ser padrão ou cabeçalhos HTTP personalizados. Se você planeja usar cabeçalhos HTTP personalizados, é sempre uma boa idéia de prefixo com X-los. Dessa forma, seus cabeçalhos não serão confundidos com os cabeçalhos HTTP padrão. Depois de ter atribuído os cabeçalhos, a função de retorno onreadystatechange é atribuído: this.xmlhttp.onreadystatechange = function () (switch (instance.xmlhttp.readyState) (case 1: if (instance.settings.onLoading) (instance.settings.onLoading (instance.xmlhttp);) break; case 2: if ( instance.settings.onLoaded) (instance.settings.onLoaded (instance.xmlhttp);) break; case 3: if (instance.settings.onInteractive) (instance.settings.onInteractive (instance.xmlhttp);) break; case 4: if (instance.settings.onComplete) (try (instance.settings.onComplete instance.xmlhttp ();) catch (e) (globals.errorHandler break (e);));) Na execução assíncrona de onreadystatechange, uma instrução switch executa um dos quatro estados válidos pronto. Da fonte, você pode associar cada número com um estado específico. O estado mais importante está pronto 4, indicando que o conteúdo foi recuperado, carregado e processado. O estado 4 pronto chama o método definido pelo cliente nas definições de propriedade. Repare na execução da função atribuída onreadystatechange que a variável de instância substituiu uma referência a isso. A execução da função onreadystatechange é um exagero, pois 98% do tempo você usa Asynchronous você só se preocupam com o estado de pronto da 4. Para todos os outros estados pronto, dependendo do navegador, uma certa funcionalidade é possível. Por causa desta inconsistência e incompletude do estado do objeto XMLHttpRequest, não há nenhuma necessidade real para o processo de outros estados pronto. O código de função restantes chamada envolve o envio do pedido para o servidor usando a função Enviar: try (this.xmlhttp.send (request.data);) catch (e) (globals.errorHandler (e);) A enviar função é usada para fazer a solicitação física para o servidor. A função também é utilizado para enviar todos os dados associados com a solicitação. Se não houver dados, em seguida, chamar enviar com valor nulo não irá gerar um erro. Quando o método enviar fez o seu pedido, ele retorna imediatamente, ea função JavaScript Asynchronous_call retornará controle para o navegador. Neste momento, o cliente deve adicionar algum código para não permitir que várias chamadas. Por exemplo, se o pedido foi ativado usando o botão, então até que o pedido foi devolvido, o botão pode ser desativado. Evidentemente, este apresenta um potencial problema, caso o pedido não retorna eo botão permanece desativado. Para resolver esse problema, você pode introduzir um temporizador que dá ao solicitar um valor máximo de tempo. Se durante esse período, a solicitação ainda não tenha retornado, o método é chamado e XMLHttpRequest.abort o botão é ativado novamente. um artigo submetido por Sonja Lande Isenção de responsabilidade:O nosso site não se responsabiliza pelo conteúdo deste artigo. Webarticles é uma fonte de informação livre. Importante: Este artigo "Implementação da Classe Asynchronous em Ajax" foi traduzida por um software automático. Nós sentimos muito por quaisquer erros de ortografia que pode ter ocorrido. Obrigado pela sua compreensão.
|
|||||
| Online: 291 users browsing the articles directory |
|
|