2011-12-14 19 views
4

比方说,我正在做3个Ajax调用,并且我想在做某事之前等待3个调用完成。用于同步事件的JavaScript库

是否有一个库在那里同步JavaScript中的多个异步事件? (使用或不jQuery的事件系统)

例:

var sync = new syncLib(); 
$('a1').click(sync.newListener()); 
$('a2').click(sync.newListener()); 

sync.wait(function(e1, e2) { 
    // fired when both a1 and a2 are clicked or when 10 seconds have passed 
    // e1 and e2 would have properties to know whether or not they timed out or not.. 
}, 10 /* timeout */)); 

我发现这一个:https://github.com/Ovea/js-sync/blob/master/README.md,但超时不被支持。 (假设第二个Ajax调用时间太长,我不希望我的同步被挂起,我想设置一个10秒的超时时间)

我知道我可以自己编码,但我只是检查这里(谷歌搜索后)

谢谢!

编辑: 从那时起,我发现异步:https://github.com/caolan/async

回答

11
$.when($.ajax("/"), $.ajax("/"), $.ajax("/")).then(function() { 
    alert("all 3 requests complete"); 
}); 

Documentation

+0

+100000如果可以的话。没有意识到这一点,但很高兴知道。 – maxedison 2011-12-14 19:30:58

+0

+1,谢谢你介绍我推迟! – 2011-12-14 19:41:27

1

.deferred.when,.then在其他答案中提到的解决方案更加优雅,但也可以编写自己的简单解决方案,以便您了解如何手动完成此任务。您只需设置一个计数器,以计算您在飞行中以及每个ajax调用的成功处理程序中调用了多少个ajax调用,则计数器递减并在计数器变为零时触发您的操作。

function DoMyAjaxCalls(callbackWhenDone) { 
    var numAjaxCalls = 3; 

    // set timeout so we don't wait more than 10 seconds to fire the callback 
    // even if ajax calls aren't done yet 
    var timer = setTimeout(callbackWhenDone, 10*1000); 

    function checkAjaxDone() { 
     --numAjaxCalls; 
     if (numAjaxCalls == 0) { 
      clearTimeout(timer); 
      callbackWhenDone(); 
     } 
    } 

    // first ajax call 
    $.ajax({ 
     url: 'ajax/test1.html', 
     success: function(data) { 
      // write code to handle the success function 
      checkAjaxDone(); 
     }, 
     error: checkAjaxDone 
    }); 

    // second ajax call 
    $.ajax({ 
     url: 'ajax/test2.html', 
     success: function(data) { 
      // write code to handle the success function 
      checkAjaxDone(); 
     }, 
     error: checkAjaxDone 
    }); 

    // third ajax call 
    $.ajax({ 
     url: 'ajax/test3.html', 
     success: function(data) { 
      // write code to handle the success function 
      checkAjaxDone(); 
     }, 
     error: checkAjaxDone 
    }); 
} 
1

在这里你有一个[库] [1]根据jQuery为此目的。

在简单的使用情况下,$.when()是最好的,但jcon-q-rency允许您同步任何异步代码段。

http://www.megiddo.ch/jcon-q-rency