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 回答