【问题标题】:How to Get the value from function in JQuery如何从 JQuery 中的函数中获取值
【发布时间】:2014-06-12 01:12:04
【问题描述】:

有人知道如何从包含 getJSON 的函数返回值吗 问题是我试图从其他函数调用该函数以获取值 但它一直未定义!!!! 我怎样才能让它工作??!?

function TranslateLatLanToAddress(LatLng) {
            var latlng = "34.1574183,-118.437125";
            var url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=" + latlng + "&sensor=false";
            $ = jQuery;
            $.getJSON(url, function (data) {
                for (var i = 0; i < data.results.length; i++) {
                    var address = data.results[i].formatted_address;
                    //                 var address = data.results[i].address_components[4].long_name + data.results[i].address_components[6].short_name;
                    //alert(address);
                    //                alert(address);
                    return false;
                }
            });
        }



  function GetVal()
    {
    var retVal =TranslateLatLanToAddress(LatLng);
    alert(retVal); //Its undefined!!!
    }

【问题讨论】:

  • ajax 中的A 表示 ASYNCHRONOUS -- 这意味着 ajax 调用是非阻塞的;当他们将控制权传递给下一行时,他们在后台工作。这被认为是 AJAX 101。因此,当您检查返回的值时,ajax 请求尚未完成。
  • 你建议我做什么?
  • 这取决于你想做什么。你真的没有太多选择;无论您需要做什么,都取决于 ajax 请求的结果,请在 ajax 回调中执行。或者你也可以准备好 jQuery promise 或 deferred。

标签: javascript jquery json json.net


【解决方案1】:

AJAX 调用是异步的。这意味着当请求被发送到服务器(谷歌地图)时,您的脚本将继续。

这是一件好事,因为这意味着您的页面将在等待结果的同时继续加载。

要利用这一点,您可以使用callback 方法。

function TranslateLatLanToAddress(LatLng, fnCallback) {
    var latlng = "34.1574183,-118.437125";
    var url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=" + latlng + "&sensor=false";
    $ = jQuery;
    $.getJSON(url, function (data) {                                // getJSON is asynchronous
        for (var i = 0; i < data.results.length; i++) {
            var address = data.results[i].formatted_address;        // get the result
            fnCallback(address);                                    // execute the callback from the parameters
        }
    });
}


function GetVal() {
    TranslateLatLanToAddress(LatLng, function(address){             // note the new callback that takes an address as a parameter
        alert(address);                                             // the callback is fired from within the SUCCESS method and now address has a value
    });
}

【讨论】:

    【解决方案2】:

    AJAX 是异步的,你正在做的是(伪):

    [call TranslateLatLanToAddress]
        |
        + ----which triggers an ajax call---[ AJAX response ]
        + ----Get here the AJAX response?          |
                                                   +--- Now is available!
    

    那么你可以做的就是在AJAX get回调中调用一个函数:

    $.getJSON(url, function (data) {
      // Other code here....
      alert( "AJAX DONE" ); // Or like: //  myCallbackFunction( data );
    });
    

    将所需的 AJAX 响应数据(如果需要)传递给您的 myCallbackFunction( data ); ,无论如何,您的 fn myCallbackFunction 只有在 AJAX 完成工作后才会被调用。

    【讨论】:

      【解决方案3】:

      $.getJSON 使用的是 XMLHTTPRequest,所以它自然是一个异步函数。最好分配一个回调函数来执行一些事情。

      function TranslateLatLanToAddress(LatLng) {
        var latlng = "34.1574183,-118.437125";
                  var url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=" + latlng + "&sensor=false";
                  $ = jQuery;
                  $.getJSON( url, execute)
                    .done(function() {
                      console.log( "second success" );
                    })
                    .fail(function() {
                      console.log( "error" );
                    })
                    .always(function() {
                      console.log( "complete" );
                    });
      }
      
      function execute(data) {
             for (var i = 0; i < data.results.length; i++) {
                console.log(data.results[i].formatted_address);
             }
      }
      

      另外,$.getJSON 有另一个方便的回调(完成、失败、总是),你可以用一些函数来覆盖,比如成功回调。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-10
        • 1970-01-01
        • 2017-11-05
        • 2016-02-01
        相关资源
        最近更新 更多