需要帮助重构javascript函数

时间:2016-05-27 06:10:07

标签: javascript

我正在查询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"如未定义。 我哪里错了?

3 个答案:

答案 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"/>