如何等待所有AJAX继续Javascript功能?

时间:2012-09-24 04:36:30

标签: javascript ajax jquery

我有一个Chrome扩展程序,我终于开始更新[已超过6mo] 我经历了将Manifest版本从1升级到2的过程。

我的扩展程序添加了一个" Poke all"按钮到Facebook,所以你不必单独戳每个人。

问题是,他们将他们的戳戳移至facebook.com/pokes,而不是在主页的框架中。

所以我的解决方法是告诉人们一旦打开/ poke就重新加载页面,这样脚本就会重新加载,然后注入" Poke All"按钮。现在,我想解决这个问题,以便当用户访问facebook.com,然后点击“#P; Pokes,"并且按钮加载,按钮自动出现。我用setTimeout设置了1.5秒,但如果有人连接速度慢,1.5秒就不够了,脚本会过早地注入按钮,导致没有按钮。

基本上,我在" Pokes"中添加一个事件监听器。链接。这就是我在运行注入代码时运行show_pokes()添加超时的内容。

我的想法是将$(document).ready() 置于 show_pokes()内,但这并不起作用,因为它从未在函数中继续使用。我猜$(document).ready()仅适用于初始页面加载?所以我试过

document.addEventListener('DOMContentLoaded', function (){ /*huge chunk of code here*/ })

但这也只是挂了,从未完成过这个功能。

所以我非常肯定Facebook在你点击facebook标签时会使用AJAX请求[请参阅here],所以也许我可以设置一个事件等到AJAX结束,然后呢可以继续我的功能,并注入按钮?任何帮助将不胜感激,或者如果您需要更多代码或更多细节,请告诉我们。或者,如果您可以访问Facebook并查看它如何加载这些标签,[并确认或否认它是否使用AJAX]这也将是一个很大的帮助。

2 个答案:

答案 0 :(得分:0)

正如杰里米所说,增加了一个反击。请注意,在AJAX循环中,返回i将继续前进。如果你需要保留当前的i,那么你需要将AJAX调用放在一个闭包中。

var pokes = $(".pokeMe");
var poked = 0;
var failed = 0;

for(var i = 0; i < pokes.length; i++) {
    $.ajax({
        url : url, 
        success : function(data) {
            poked++;

            if (poked + failed == pokes.length) {
                // all actions returned
            }
        },
        error : function(data) {
            failed++;

            // optional logic
        }
    });
}

答案 1 :(得分:0)

我不知道这对你是否有帮助,但听起来你可以使用jQuery提供的$.when().done()。这样它将等到when()内的所有AJAX调用完成后再继续使用你在done()内调用的函数的其余部分。

http://api.jquery.com/jQuery.when/