1

jquery .ajaxを使用してWebからデータをプルする関数crimeTrendTableから、postcodeConvertという関数にデータを返そうとしています。

データが返されたときにのみ情報を返すようにするためにコールバック関数を実装する必要があると思いますが、それを行う方法について少し混乱していますか?誰か助けてもらえますか?

$(document).ready(function()
{
function crimeTrendTable(latitude, longitude){
    //Find all available dates
    availability_url = "http://policeapi2.rkh.co.uk/api/crimes-street-dates";
    listings = $.ajax({

        dataType: 'jsonp',
        url: availability_url, 
        success: function(data){
            latest = data[0]['date'];
            three_months_date = data[3]['date'];
            six_months_date = data[6]['date'];
            year_ago_date = data[12]['date'];
            list_dates = [latest, three_months_date, six_months_date, year_ago_date];
        },
        error: function(jqXHR, textStatus, errorThrown){ 
            $('#results').html('<h2>Something went wrong!</h2><p><b>' + textStatus  + '</b> ' + errorThrown  + '</p>');
        }
    })


} 
function postcodeConvert(entry){

    //Convert to upper case
    entry = entry.toUpperCase().replace(" ", "");
    base_url = "http://mapit.mysociety.org/postcode/";
    query_url = base_url+entry;
    console.log(query_url);
    $.getJSON(query_url, function(data){
        $('div#results').html("<p>Latitude: "+data['wgs84_lat']+"</p><p>Longitude: "+data['wgs84_lon'])+"</p>";
        data_results = "";
        data_results = crimeTrendTable(data['wgs84_lat'], data['wgs84_lon']);
        console.log("postcode"+data_results);
        return data_results;
    })

}    

$('#postcode').focus(); //ensure the place field is the first box highlighted
      //Disable the submit button from sending anything as we don't need to...
$('#form_submit').submit(function(){
  return false;
});//end submit function
$(':submit').click(function(){
    //function convert text box postcode into lat long
 if ($('#postcode').val() !=''){
    entry = $('#postcode').val();
    postcodeConvert(entry);           
 }  
}); 

});

4

3 に答える 3

2

このメソッド/関数は、サーバーからデータが返されたときに実行されます (http ステータス 200)。

function(data){
        latest = data[0]['date'];
        three_months_date = data[3]['date'];
        six_months_date = data[6]['date'];
        year_ago_date = data[12]['date'];
        list_dates = [latest, three_months_date, six_months_date, year_ago_date];
    }

その関数内にメソッドへの呼び出しを追加すると、データがあるときに実行されます。それ以外の場合は、次のような別の関数を使用する方が簡単な場合は、「成功:」にメソッド名を書き込むだけです。

function callback(data) {
  // do something with data
}

$.ajax({

    dataType: 'jsonp',
    url: availability_url, 
    success: callback,
    error: function(jqXHR, textStatus, errorThrown){ 
        $('#results').html('<h2>Something went wrong!</h2><p><b>' + textStatus  + '</b> ' + errorThrown  + '</p>');
    }
});
于 2012-11-20T16:51:21.620 に答える
0

ajax XHRオブジェクトを返す場合は、組み込みのdone()コールバックを使用して、データが使用可能であることを確認できます。

$(document).ready(function() {
function crimeTrendTable(latitude, longitude){
    return $.ajax({
        dataType: 'jsonp',
        url: availability_url, 
        error: function(jqXHR, textStatus, errorThrown){ 
            //error function does'nt work with JSONP, remove this
        }
    }):
}

function postcodeConvert(entry){
    /* more stuff here */
    return $.getJSON(query_url, function(data){
        $('div#results').html("<p>Latitude: "+data['wgs84_lat']+"</p><p>Longitude: "+data['wgs84_lon'])+"</p>";
        return crimeTrendTable(data['wgs84_lat'], data['wgs84_lon']);
    }):
}    

$('input[type="submit"]').click(function(e){
    e.preventDefault();
    if ($('#postcode').val() !=''){
       entry = $('#postcode').val();
       postcodeConvert(entry).done(function(data) {
          //data is now avaiable here
          latest = data[0]['date'];
          three_months_date = data[3]['date'];
          six_months_date = data[6]['date'];
       });
    }  
}); 

すべての変数がグローバルであるなど、コードにいくつかのエラーがあることに注意してください。

于 2012-11-20T16:59:25.353 に答える
0

関数からデータ結果を取得するには、コールバックが必要であることは間違いありませんpostcodeConvert

あなたが今持っているリターン

return data_results;

本当に何もしません。postcodeConvertコールバック引数を受け入れるように関数定義を変更した場合

function postcodeConvert(entry, callback) {

returnステートメントをコールバック呼び出しに変更します

callback(data_results)

postcodeConvert次に、次のように関数を呼び出すことができます。

postcodeConvert(entry, function(data_results) {
// use data_results
});
于 2012-11-20T16:52:18.507 に答える