【问题标题】:Javascript function order AJAX [duplicate]Javascript函数命令AJAX [重复]
【发布时间】:2015-07-11 11:53:41
【问题描述】:

我的问题是 pointOnMap() 在 xmlPreparer() 之前运行,尽管已订购。 我认为这与使用 AJAX 有关。 parseXML 创建我需要的对象。 所以当我使用 pointOnMap() 时,它应该已经被初始化了。

页面上首先是我从 pointOnMap - 0 看到的,然后是从 parse 看到的 ..所以它的顺序不正确。
谢谢你的建议。

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);
}

【问题讨论】:

  • @Ed Cottrell:您是否看过关于“重复”的公认答案...使用async: false! Argggh ...该答案应该被删除,并且永远不要用作重复! :)

标签: javascript jquery ajax


【解决方案1】:

用这样的 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"
  });
}

注意:thendone 之间的区别在于then 允许传递第二个fail 函数。 done 类似于 Ajax 中的 success: 并具有匹配的 fail() 函数,因此您也可以编写。

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

【讨论】:

  • 可以保留成功功能。它将在 done / then 之前执行
  • @Royi Namir:一个很好的理由不这样做:您可能希望在 没有parseXml 调用的情况下使用该加载函数。最好在调用代码中这样做。
  • @Royi Namir:当然函数名也应该改变(例如改为loadXML :))
猜你喜欢
  • 2013-05-06
  • 2012-08-14
  • 2013-08-11
  • 2016-12-31
  • 2011-07-06
  • 2019-07-05
  • 2016-04-26
  • 1970-01-01
  • 2012-10-18
相关资源
最近更新 更多