如何正确传递JQuery延迟参数?

时间:2016-02-19 19:58:02

标签: jquery jquery-deferred

这是我的jQuery代码。我基本上是在抓取一些基于IP的坐标,然后检索该位置的一些记录。我遇到的问题是从第一个ajax调用中检索的参数对第二个ajax调用不可用。我是defer的新手,并不真正理解为什么这不起作用?我在代码中留下了一些评论作为问题和问题所在。一个完整的答案将解释我所缺少的内容及其重要性。我试图绕过这个来使我的代码更清洁而不是嵌套调用。

$(document).ready(function() {
  $('#button').on('click', function() {
    //if the first call is successful then run the second function
    //is done the correct thing to use here?
    getLocation().done(getRecords);
  });
  //this works fine as i get the coordinates
  function getLocation() {
    return $.ajax({
      dataType: "json",
      url: 'http://ipinfo.io/json',
      success: function(response) {
        var coordinates = response.loc.split(',');
        return coordinates;
      }
    });
  }

  function getRecords(coordinates) {
   return $.ajax({
      dataType: "json",
      url: 'some url',
      data: {
        //this does not work as coordinates are undefined
        lat : coordinates[0],
        lon : coordinates[1],
      },
      success: function(response) {
        //do more stuff
      }
    });
  }

});

3 个答案:

答案 0 :(得分:3)

要使此工作与您期望的一样,您需要删除success:,而是使用.then,以便您可以将值传递给链中的下一个承诺。

function getLocation() {
  return $.ajax({
    dataType: "json",
    url: 'http://ipinfo.io/json'/*,
    success: function(response) {
      var coordinates = response.loc.split(',');
      return coordinates;
    }*/
  }).then(function (response) {
    var coordinates = response.loc.split(',');
    return coordinates;
  });
}

答案 1 :(得分:1)

您的问题success处理程序的结果未传递给done处理程序。原始response已通过。您可能想要then

然而,绝对没有理由在 2016 中使用jQuery。

答案 2 :(得分:-2)

您的函数调用是向后的。尝试:

getRecords(getLocation());