2015-05-01 2 views
1

Моя проблема в том, что pointOnMap() работает до xmlPreparer(), несмотря на порядок. Я думаю, что это как-то связано с использованием AJAX. parseXML создает объект, который мне нужен. Поэтому, когда я использую pointOnMap(), он уже должен быть инициализирован.Javascript function order AJAX

На первой странице я вижу из pointOnMap - 0 и после этого из синтаксического разбора. Так что это не в правильном порядке.
Благодарим вас за советы.

var mesta= new Array(); 


function init() { 
    xmlPreparer(); 
    pointOnMap(); 
} 

//add source 
function xmlPreparer() { 
    $.ajax({ 
    type: "GET", 
    url: "./mesta.xml", 
    dataType: "xml", 
    success: parseXml 
    }); 
} 

function parseXml(xml) { 

    var type; 
    var name; 
    var latitude; 
    var longitude; 

    $(xml).find("city").each(function() 
    { 
    type=$(this).find("type").text(); 
    name=$(this).find("name").text(); 
    latitude= $(this).find("latitude").text(); 
    longitude=$(this).find("longitude").text(); 
    var mesto = {type:type, name:name, latitude:latitude, longtitude:longitude}; 
    mesta.push(mesto); 
    }); 
    alert(mesta.length);//this prints right size 
} 

//add source 
function pointOnMap() { 
alert(mesta.length);//for no reason prints 0 and runs before xmlparser? 
$('#dot').css('top', YLatToPixel(0,$('#jpMapa'))) 
$('#dot').css('left', XLngToPixel(0,$('#jpMapa'))+'px'); 
} 

function YLatToPixel(lat,elem){ 
var containerHeight=$(elem).height(); 
lat+=90; 
var calculatedHeight=((lat*containerHeight)/180); 
return $(elem).offset().top+($(elem).height()-calculatedHeight); 
} 


function XLngToPixel(lng,elem){ 
var containerWidth=($(elem).width()); 
lng=lng+180; 
return $(elem).offset().left+((lng*containerWidth)/360); 
} 
+0

@Ed Cottrell: Вы рассмотрели принятый ответ на этот «дубликат» ... используйте 'async: false'! Арггх ... Этот ответ нужно удалить и никогда не использовать в качестве дубликата! :) –

ответ

3

паяльная его с JQuery обещает так:

function init() { 
    xmlPreparer().then(function(data){ 
     parseXml(data); 
     pointOnMap(); 
    }); 
} 

//add source - returns the Ajax promise 
function xmlPreparer() { 
    return $.ajax({ 
    type: "GET", 
    url: "./mesta.xml", 
    dataType: "xml" 
    }); 
} 

Примечание: разница между then и done что then позволяет для второго fail функция, которая будет пройдена. done похож на success: в Ajax и имеет функцию fail(), чтобы вы могли писать.

function init() { 
    xmlPreparer().done(function(data){ 
     parseXml(data); 
     pointOnMap(); 
    }).fail(function(){ 
     alert("arggh!"); 
    }); 
} 
+0

вы можете сохранить функцию успеха. он будет выполнен до 'done' /' then' –

+0

@Royi Namir: Одна очень хорошая причина не в том: вы можете использовать эту функцию загрузки * без * вызова 'parseXml'. Лучше всего это сделать в вызывающем коде. –

+0

у вас есть точка. –