我正在查询zippopotam.us邮政编码查询服务以返回城市信息。 这个独立的代码块有效:
$("#studentPostCode").blur(function() {
var zip_in = $(this);
if (zip_in.val().length == 5) {
$.ajax({
url: "http://api.zippopotam.us/SE/" + zip_in.val(),
cache: false,
dataType: "json",
type: "GET",
success: function(result, success) {
// Accept the first result
var places0 = result['places'][0];
var placeName = places0['place name'];
$("#studentCity").val(placeName);
},
error: function(result, success) {}
});
}
});
然而,当我尝试重构以便我可以在其他地方使用它时,它会中断。 我的努力:
//calls
$("#studentPostCode").blur(function() {
var pCode0 = $(this);
var myCity0 = getPlaceFromPostCode(pCode0);
$("#studentCity").val(myCity0);
});
$("#guardian1PostCode").blur(function() {
var pCode1 = $(this);
var myCity1 = getPlaceFromPostCode(pCode1);
$("#guardian1City").val(myCity1);
});
//function refactored as:
$(function getPlaceFromPostCode(pCodeX) {
var zip_in = pCodeX;
if (zip_in.val().length == 5) {
$.ajax({
url: "http://api.zippopotam.us/SE/" + zip_in.val(),
cache: false,
dataType: "json",
type: "GET",
success: function(result, success) {
// Accept the first result
var places0 = result['places'][0];
var placeName = places0['place name'];
return placeName;
},
error: function(result, success) {}
});
}
});
这将返回" placeName"如未定义。 我哪里错了?
答案 0 :(得分:0)
如果你希望这个工作,那么你应该在你的$ .ajax中添加async:false,因为$ .ajax是异步的,你是未定义的。如果你想让它成为aysnc那么你应该有希望的东西。
答案 1 :(得分:0)
成功处理程序中的Solve[-b LMR + LMA RGR - a LMR Log10[e LMA + (d LMA (1 - LMR) SAR)/x] == 0, x]
{{x -> ConditionalExpression[(
d LMA (-1 + LMR) SAR)/(-10^(-((b LMR - LMA RGR)/(a LMR))) +
e LMA), -\[Pi] <=
Im[(b LMR - LMA RGR)/(a LMR)] Log[10] < \[Pi]]}}
语句被忽略,因为函数本身是异步调用的,return placeName;
方法不返回任何内容。尝试以下方面:
getPlaceFromPostCode
然后调用该函数(这可能是一个更容易的简写,而不是一个完整的函数):
function getPlaceFromPostCode(pCodeX, cityCallback) {
//... the $.ajax call
success: function(result, success) {
// Accept the first result
var places0 = result['places'][0];
var placeName = places0['place name'];
cityCallback(placeName);
}, //... etc
}
答案 2 :(得分:0)
因为请求需要一些时间才能完成,所以将作为变量更改的项传递给函数可能更有意义,然后让函数使用项中的数据来获取邮政编码,然后再使用在通话成功时更新input
框。
function updateInputByZipCode(inputElementToRead) {
var zipCode = $(inputElementToRead).val();
if (zipCode.length == 5) {
$.ajax({
url: "http://api.zippopotam.us/US/" + zipCode,
cache: false,
dataType: "json",
type: "GET",
success: function(result, success) {
// Accept the first result
var places0 = result['places'][0];
var placeName = places0['place name'];
$('#' + $(inputElementToRead).attr('output')).val(placeName);
},
error: function(result, success) {}
});
}
}
//calls
$("#studentPostCode, #guardianPostCode").blur(function() {
updateInputByZipCode(this);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="studentPostCode" output="studentCity" value="32003"/>
<input id="guardianPostCode" output="guardianCity" value="10005"/><br>
<input id="studentCity"/>
<input id="guardianCity"/>