javascript - A variable that I've initialized is undefined when I try to use it on the next line of code -
i'm developing web application heavily using javascript , jquery.
i create app
object when web page loads , call init()
method in footer.
var app = new app(); app.init();
these first lines of code in init()
method.
// load index app.loadindex(); alert(hashtag_index);
these few lines of loadindex()
method.
hashtag_index = []; // load topic json file $.ajax({ url : './data/index.json', type : 'get', datatype : 'json', . . . // if file loading successful, save index data success : function(data){ var raw_index = []; $.each(data, function(key, val) { raw_index.push(data[key]); }); // add hashtag object global hashtag_index hashtag_index = raw_index; } });
basically loadindex()
method loads json file 135kb , load data object hashtag_index
variable. hashtag_index
variable defined global, it's accessible globally.
the variable hashtag index have 8 different object
arrays. during when try alert()
variable, variable isn't initialized yet.
but alert()
returns blank message. when return message:
alert(typeof(hashtag_index))
i undefined
message.
but i'm sure variable loaded because, when access variable via google chrome's console, can see variable loaded , objects in there.
the solved problem using line of code:
// load index app.loadindex(); settimeout( function(){ alert(hashtag_index); }, 500);
by making javascript sleep 500 ms, i've given enough time load up.
of course i've tried following solutions none of them succeeded:
solution 1: (goes infinite loop)
// load index app.loadindex(); while(!hashtag_index.length > 0) { continue; }; alert(hashtag_index);
solution 2: (goes infinite loop)
// load index app.loadindex(); while(hashtag_index.length == 0) { continue; }; alert(hashtag_index);
solution 3: (goes infinite loop)
// load index app.loadindex(); while(typeof hashtag_index === 'undefined') { continue; }; alert(hashtag_index);
solution 4:* (goes infinite loop)
// load index app.loadindex(); while(typeof hashtag_index == null) { continue; }; alert(hashtag_index);
now question how can solve problem without causing future problems. i've tried tackle problem previous solutions, none of them have succeeded properly.
your app.loadindex();
method uses ajax, async. alert(hashtag_index);
executes before ajax call has completed , result processed.
change code use callback, or (my preference) have app.loadindex();
return promise object.
here's how implement promise:
var loadindex = function() { var def = $.deferred(); $.ajax({ //... success: function(result) { // whatever def.resolve(); } //... }); return def.promise(); };
....
// load index app.loadindex().done(function() { alert(hashtag_index); });
you may need extend have init()
return promise or accept "finished" callback well, depending on usage.
Comments
Post a Comment