$ .when()。done()没有按预期工作

时间:2015-07-02 15:09:48

标签: javascript jquery ajax

我需要通过jquery ajax将html加载到页面上。然后,在加载html之后,我想解析它将在加载的html中的某些数据,并使用它来创建地图标记。所以我需要load方法同步操作,以便在我的setMarkers()方法尝试解析之前明确加载html。

$.when($("#orders").load("datadisp.aspx")).done(function () {
    setMarkers();
});

我认为我当前设置的确应该这样做,但我可以从调试器中看出setMarkers()在加载完成之前仍然被调用,因为当我在setMarkers()上放置一个断点时并且在它遇到此断点后检查html,我可以看到预期的html尚未加载。有人能告诉我解决这个问题的正确方法吗?感谢。

3 个答案:

答案 0 :(得分:6)

您遇到的问题是load()未返回可与$.when一起使用的承诺。如果要在load()完成后执行某些代码,请将其放在回调处理程序中:

$("#orders").load("datadisp.aspx", function() {
    setMarkers();
});

答案 1 :(得分:0)

我认为您滥用jQuery.when(),因为该方法是Deferred对象的一部分,它实现了 Promise接口jqXHR对象由jQuery.ajax()返回,实施承诺界面,为其提供 Promise 的所有属性,方法和行为(请参阅Deferred object了解更多信息)

更好的方法可以如下:

$.when(
  $.ajax({
    type: "GET",
    url: "datadisp.aspx"
    //dataType: "html"
  })
).then(
  function done(data) {
    console.info("done!");
    console.log(data);
    setMarkers();
  },
  function fail(jqXHR, textStatus) {
    console.log(jqXHR);
  }
);

您可以使用jQuery.ajax()并传输/处理jqXHR对象: https://stackoverflow.com/a/30848934/2247494

或者您可以将Deferred对象与jQuery.when()一起使用来处理Promise界面: https://stackoverflow.com/a/30923089/2247494

答案 2 :(得分:0)

如果你想加载WebForm或Html页面,那么在加载处理程序中使用load和pass函数并做其余的事情。

$("#orders").load("datadisp.aspx", setMarkers);

/*Handler function*/
function setMarkers(data)
{
/*Code*/
}