javascript - Requisições AJAX e WeakMaps - Stack Overflow em Português
Enquanto eu colocava em prática o que eu eu aprendi até agora sobre a ES2015 com a Babel. especificamente sobre WeakMaps, cheguei num problema que eu não sei porque acontece e, com isso, não sei como resolver.
Eu tenho um WeakMap definido pra armazenar informações vindas de uma Requisição AJAX a qual só é disparada se esse WeakMap não tiver nada armazenado.
Eu cheguei a isso:
constructor( id ) {
id = Number( id );
if( id <= 0 || isNaN( id ) ) {
throw new TypeError( 'Invalid User ID' );
_id.set( this, id );
return _id.get( this );
if( _data.get( _this ) === undefined ) {
_this.loadData().done( function( data ) {
// JSON is indeed successfully loaded
_data.set( _this, data );
// WeakMap is indeed set correctly
console.log( _data.get( _this ) );
// But here it's undefined again!
return _data.get( _this );
return $.get({
url: '/users/' + _id.get( this, data ),
let _id   = new WeakMap;
let _data = new WeakMap;
var user = new User( 1 );
console.log( user.getID(), user.getData() ); // 1 undefined
Até onde eu sei o WeakMap foi definido corretamente, tanto é que o mesmo é feito com o ID do usuário e este pode ser obtido normalmente, descartando, assim, possíveis problemas com o transcompiler.
Mas as informações vindas por AJAX, mesmo que estejam vindo corretamente dentro do jquery.done() não podem ser acessadas fora dele.
A única forma que consegui fazer funcionar foi setando async: false no $.ajax, o que eu sei que não é certo.
O que estou fazendo de errado? Sem saber o porquê eu não posso nem pesquisar sobre o assunto e tentar por mim mesmo.
javascript jquery ajax ecmascript-5
perguntada 26/01/17 às 10:36
A questão aqui é basicamente a mesma que esta, ou esta. Ou seja: o ajax é assíncrono. Isso quer dizer que:
// pseudo código:
ajax(function(){
console.log(x); // dá 10
O que acontece é que o ajax demora tempo a executar e, mesmo sendo muito rápido) o código vai continuar a correr chegando ao console.log antes do ajax ser completado.
A solução para isso é chamar o console.log quando o ajax tiver algo para retornar. Isso pode ser feito com callback, ou com Promises.
A solução é, como encontraste, fazer getData retornar um objeto deferido, tipo Promise:
user.getData().done(function(data){
respondida 26/01/17 às 16:52
Eu não entendo de JavaScript ao ponto de dizer que esta é a solução correta mas eu pesquisei MUITO e li inúmeras respostas tanto no stack Overflowen como Internet à fora, as quais na tentativa de ensinar as pessoas a pescarem, acabaram matando elas de fome com respostas quase intermináveis, complexas ou que simplesmente acabavam escondendo a solução em meio à tantas informações nem tão necessárias assim.
A quem de interesse for:
if( _data.get( this ) === undefined ) {
_data.set( this, this.loadData() );
return _data.get( this );
return $.getJSON( CARD_LIST + '/player/' + _id.get( this ) );
user.getData().done( function( data ) {
Não é o que eu tinha em mente inicialmente, já que vou ter que usar jQuery.done() cada vez que for utilizar um simples getter (que na minha opinião deveria trazer as informações prontas pra uso) tampouco poderia explicar os "comos" ou os 'porquês".
Seria bom saber, claro, e se alguém quiser/puder responder explicando de forma didática seria incrível, mas por agora eu humildemente espero que ajude alguém mais que esteja tentando extrair informações simples de respostas/comentários pouco amigáveis pra quem não entende bem do assunto como eu.
respondida 26/01/17 às 12:09
Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag javascript jquery ajax ecmascript-5 ou faça sua própria pergunta.