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