0

実行されない$.getJSONリクエストがありますが、リクエストの直後のコード行が実行されます。$ .getJSONリクエストの後にすべてのコードを削除すると、リクエストが実行されます。返されたデータを繰り返し実行するリクエストを取得し、リクエストに続いてコードを実行するにはどうすればよいですか。

var eventList = new Array();
$.getJSON('../index.php?/home/events', function(eventItems){    
    $.each(eventItems, function() {
        var event = this;
        var eventItem = new Array();
        // format the date and append to span
        eventItem[0] = formatMDYDate(formatTimeStamp(this.loc_datetime, false), 0);
        // add shortdescription to div
        eventItem[1] = this.shortdescription; 

        // check if longdescription exist
        if (this.longdescription) {
            // create new anchor element for "More Info" link on events
            var link = $('<a></a>');
            link.attr('href', '../index.php?/home/event_info');
            link.addClass('popup');
            link.html('More Info');
            //link.bind('click', eventPopUp());
            link.bind('click', function() {
                var addressValue = event.id;
                dialog = $('<div></div>').appendTo('body');
                dialog.load('../index.php?/home/event_info', 
                    {id: addressValue});
                dialog.modal({
                    opacity: 80
                });
                return false;
            });
            eventItem[2] = link;
        }
        eventList.push(eventItem);
    });  
});
// removing the following lines of code will let the .getJSON request run
if (eventList.length > 0) {
    write_Events(eventList);
}

この問題の原因がわかりません。助けてください。

4

4 に答える 4

4

非同期とは、呼び出したときに、JS ランタイムが終了を待たずに次のコード行を実行することを意味します。通常、この場合はコールバックを使用する必要があります。

それは次のようなものです:

var a="start";
setTimeout(function(){
 a="done";
 dosomethingWithA(a);
},1000);
if(a=="done"){}//doesn't matter, a is not "done"
function dosomethingWithA(a){
 // a is "done" here
}

あなたの場合、コードは次のようになります。

var eventList = new Array();
$.getJSON('../index.php?/home/events', function(eventItems){    
    $.each(eventItems, function() {
        var event = this;
        var eventItem = new Array();
        // format the date and append to span
        eventItem[0] = formatMDYDate(formatTimeStamp(this.loc_datetime, false), 0);
        // add shortdescription to div
        eventItem[1] = this.shortdescription; 
        // check if longdescription exist
        if (this.longdescription) {
            // create new anchor element for "More Info" link on events
            var link = $('<a></a>');
            link.attr('href', '../index.php?/home/event_info');
            link.addClass('popup');
            link.html('More Info');
            //link.bind('click', eventPopUp());
            link.bind('click', function() {
                var addressValue = event.id;
                dialog = $('<div></div>').appendTo('body');
                dialog.load('../index.php?/home/event_info', 
                    {id: addressValue});
                dialog.modal({
                    opacity: 80
                });
                return false;
            });
            eventItem[2] = link;
        }
        eventList.push(eventItem);
    });
    processEventList();  
});
function processEventList(){
  // removing the following lines of code will let the .getJSON request run
  if (eventList.length > 0) {
    write_Events(eventList);
  }
}
于 2013-03-07T04:29:01.433 に答える
3

試す

var eventList = new Array();
    $.getJSON('../index.php?/home/events', function (eventItems) {
        $.each(eventItems, function () {
            //....
            eventList.push(eventItem);               
        });
        // removing the following lines of code will let the .getJSON request run
        if (eventList.length > 0) {
            write_Events(eventList);
        }
    });

または、jquery 手法で PubSub を使用することもできます

 var eventList = new Array();
    $.getJSON('../index.php?/home/events', function (eventItems) {
        $.each(eventItems, function () {
           //....
            eventList.push(eventItem);               
        });            
        //publisher
        $(document).trigger('testEvent', eventList);
    });

    //subscriber
    $(document).bind("testEvent", function (e, eventList) {
        if (eventList.length > 0) {
            write_Events(eventList);
        }
    });

詳細についてはhttp://www.codeproject.com/Articles/292151/PubSub-with-JQuery-Events

幸せなコーディング.. :)

于 2013-03-07T04:25:53.920 に答える
1

$.getJSON非同期呼び出しです。コールバックは、現在の関数が完全に実行されるまで実行されません。呼び出し後のコードは、コールバックが実行される前に常に実行されgetJSONます。

write_Events関数がエラーをスローして実行を停止している可能性があるため、コールバックが実行されていません。または、実際には実行されていますが、追加のコードによって呼び出された何らかの理由でその証拠が見られません。

于 2013-03-07T04:22:41.850 に答える
0

javascriptコードはサーバーからの応答を待つことはなく、サーバーからの応答を取得するまでjavascriptの処理を停止する必要があります。

jquery.Deferredを使用してこれを行うことができます

このチュートリアルにアクセスすることもできます。

于 2013-03-07T04:45:52.830 に答える