Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确传递JQuery延迟参数?_Jquery_Jquery Deferred - Fatal编程技术网

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

如何正确传递JQuery延迟参数?,jquery,jquery-deferred,Jquery,Jquery Deferred,这是我的jQuery代码。我基本上是基于IP获取一些坐标,然后检索一些位置记录。我遇到的问题是,从第一个ajax调用检索到的参数对第二个ajax调用不可用。我是deferred's的新手,真的不明白这为什么不起作用?我在代码中留下了一些注释作为问题以及问题所在。一个完整的答案可以解释我遗漏了什么以及为什么它很重要。我正试着将我的头脑集中在这一点上,使我的代码更干净,而不是嵌套调用 $(document).ready(function() { $('#button').on('click',

这是我的jQuery代码。我基本上是基于IP获取一些坐标,然后检索一些位置记录。我遇到的问题是,从第一个ajax调用检索到的参数对第二个ajax调用不可用。我是deferred's的新手,真的不明白这为什么不起作用?我在代码中留下了一些注释作为问题以及问题所在。一个完整的答案可以解释我遗漏了什么以及为什么它很重要。我正试着将我的头脑集中在这一点上,使我的代码更干净,而不是嵌套调用

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

});

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

getRecords(getLocation());

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

getRecords(getLocation());

要使这项工作如您所期望的那样工作,您需要删除
success:
,而是使用
。然后
,以便将价值传递给链中的下一个承诺

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

要使这项工作如您所期望的那样工作,您需要删除
success:
,而是使用
。然后
,以便将价值传递给链中的下一个承诺

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

您的问题是,
success
处理程序的结果没有传递给
done
处理程序。传递原始的
响应
。你可能想要
然后


但是,绝对没有理由在2016年使用jQuery。

您的问题是
成功
处理程序的结果没有传递给
完成
处理程序。传递原始的
响应
。你可能想要
然后



不过,绝对没有理由在2016年使用jQuery。

坐标不应该是未定义的。您确定它实际上不等于成功回调中的
response
?@KevinB我将再次检查以验证。@KevinB在第一次ajax调用中,整个对象仍然存在,这使得坐标未定义,因为它们不是可直接访问的变量。那么这应该是什么样子呢?做正确的事情叫什么?为什么人们对这个问题投反对票?这是一个合理的问题。@Smeegs我同意。我有两张反对票。
坐标不应该是未定义的。您确定它实际上不等于成功回调中的
response
?@KevinB我将再次检查以验证。@KevinB在第一次ajax调用中,整个对象仍然存在,这使得坐标未定义,因为它们不是可直接访问的变量。那么这应该是什么样子呢?做正确的事情叫什么?为什么人们对这个问题投反对票?这是一个合理的问题。@Smeegs我同意。我有两张反对票,或者没有。getLocation返回一个承诺,而不是坐标。它仍然将结果传递到getRecords函数中,然后可以将其解析出来。不,它不返回,结果仍然在承诺内。您必须对其使用.then(function(){…})才能获得结果。(或者.done,)但是你会马上回到OP所处的当前状态,因为你会得到响应而不是坐标。或者没有。getLocation返回一个承诺,而不是坐标。它仍然将结果传递到getRecords函数中,然后可以将其解析出来。不,它不返回,结果仍然在承诺内。您必须对其使用.then(function(){…})才能获得结果。(或.done,)但是你会马上回到OP所处的当前状态,因为你得到的是响应而不是坐标。这非常有效,而且对于如何使用then发送“成功”信息更有意义。你会改变我代码中的其他内容以提高效率吗?再一次,我在学习,所以任何能让我更有效的东西我都愿意接受。不是真的,除了不使用这样一个通用id值
“#按钮”
好注意。我打算改变这一点。这只是为了得到一个功能性的例子。这非常有效,而且对于如何使用then来发送“success”更有意义。你会改变我代码中的其他内容以提高效率吗?再一次,我在学习,所以任何能让我更有效的东西我都愿意接受。不是真的,除了不使用这样一个通用id值
“#按钮”
好注意。我打算改变这一点。这只是为了得到一个函数示例。