Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在合并$.get和$.ready_Javascript_Jquery_Ajax_Race Condition - Fatal编程技术网

Javascript 正在合并$.get和$.ready

Javascript 正在合并$.get和$.ready,javascript,jquery,ajax,race-condition,Javascript,Jquery,Ajax,Race Condition,简单地说,我有一个ajax调用,有时会在加载页面之前完成,因此我尝试将回调包装在$(fn)中,但如果加载页面,回调不会触发。。。有人有好的解决办法吗 $.get( '/foo.json', function( data ){ $( function(){ // won't get here if page ready beats the ajax call // process data $( '.someDiv' ).append( s

简单地说,我有一个ajax调用,有时会在加载页面之前完成,因此我尝试将回调包装在
$(fn)
中,但如果加载页面,回调不会触发。。。有人有好的解决办法吗

$.get( '/foo.json', function( data ){
    $( function(){
        // won't get here if page ready beats the ajax call

        // process data
        $( '.someDiv' ).append( someData );
    } );
} );

是的,我知道如果我改变了它们的顺序,它将始终工作,但是我的ajax调用将被不必要地推迟到文档准备就绪。

否,添加到onDOMready的函数将始终被执行,并且如果事件已经发生,将立即被执行。请参阅:处的文档,仅当您使用
$(document).bind(“ready”)
事件已触发时,它将不会执行


非触发事件处理程序的一个可能原因是其他处理程序抛出错误。jQuery有一个待执行处理程序的内部数组,处理本机DOM加载事件的方法只是对其进行迭代。如果其中一个早期处理程序出现错误,循环将中断,随后添加的其他处理程序将不会被调用。

将结果加载到全局变量中,并将其加载到DOM就绪状态。关键是,如果结果为空,则使用
setTimeout
进行迭代,直到结果为空为止

var result;
$.get("/foo.json", function(data) {
    result = data;
});

function insertAJAX() {
    if(result !== undefined) {
        $(".someDiv").append(result);
    } else {
        setTimeout(insertAJAX, 250);
    }
}

$(function() {
    insertAJAX();
});
注意,您可以添加一个超时计数器,在一定时间后停止尝试,以防AJAX由于任何原因永远不会返回结果

var result;
$(document).on('ready.specialAjax', function () {
   if (result) {
      $(".someDiv").append(result);
   }
});
$.get('/foo.json').done(function (data) {
   if ($(".someDiv").length) {
      $(".someDiv").append(data);
      $(document).off('ready.specialAjax');
   }
   else {
      result = data;
   }
});

本质上,如果可以的话,ajax将尝试立即附加到someDiv。否则,它会将ajax结果存储在
result
document.ready
中,并在运行时自行追加。执行
.off
是为了防止在ajax成功添加数据的情况下添加两次数据。这不重要,因为在这种情况下,结果将是空的,只是为了保持干净。

您需要检查AJAX回调中的dom是否就绪,以确保是在就绪后追加还是立即追加。参见下面的代码

var isDomReady = false;

$.get( '/foo.json', function( data ){
    if (isDomReady) {
      $(function(){  $('.someDiv').append( someData );   });
    } else {
       $('.someDiv').append( someData );  
    }
} );

$(function(){
   isDomReady = true;
   // and all you ready code
});

这样做没有坏处

var getData;
$.get( '/foo.json', function( data ){
    getData = data;
});
$(function() {
    var intt = setTimeinterval(function() {
         if(getData.length) {
              //do your task
              clearInterval(intt);
         }
    }, 100);
});

下面是另一个使用延迟的方法。显然,您可以在
文档中使用延迟。ready
,这有点奇怪:

$(document).data("readyDeferred", $.Deferred()).ready(function() {
   $(document).data("readyDeferred").resolve();
});
var jqxhr = $.get('/foo.json');
$.when(jqxhr, $(document).data('readyDeferred'))
   .done(function (jqxhr) {
      $(".someDiv").append(jqxhr[2].responseText);
   });

那很好。它们不是:)确切的代码:
~函数($,RC){$.getJSON('json/financial plan.json',函数(accounts){console.log('step1');$(函数(){console.log('step2');$.replaceTmpl('financial_plan_template');WBR.initSection('financial plan');})}(jQuery,window.RazorCharts)
step1
始终被记录<代码>第二步
有时会。@cwolves,是的,他们是。您的代码有其他问题@Bergi——代码是一样的:)只是指出我什么都没做different@cwolves:当然是这样,否则它会起作用:-)让我猜猜:您在代码中的某个地方添加了其他onload处理程序?@Bergi,不,这是旧版本jQuery中的一个bug。我将ready函数替换为一个函数,如果
document.ready
已经启动并且现在可以运行,则立即触发回调。您还没有尝试过这个方法,是吗?@cWalves这不起作用的事实是
$.ready
中的一个bug。它应该只是work@Raynos-嗯。我使用的是较旧版本的jQuery,因为这是一个现有项目。可能需要修补。我喜欢这个答案。这正是自定义事件处理程序的用途。如果在DOM就绪后完成AJAX需要100毫秒以上,该怎么办?在这种情况下,设置间隔总是不好的。。您永远不知道返回响应需要多长时间。@SKS,您是什么意思?下一轮比赛后,间隔时间会检查吗100ms@Statx嗯。。我的错。。但仍然不是处理这个案件的好方法。