Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.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 如何确保XMLHttpRequest在for循环内部完成?_Javascript_Facebook Graph Api_Facebook Opengraph - Fatal编程技术网

Javascript 如何确保XMLHttpRequest在for循环内部完成?

Javascript 如何确保XMLHttpRequest在for循环内部完成?,javascript,facebook-graph-api,facebook-opengraph,Javascript,Facebook Graph Api,Facebook Opengraph,我有一段代码,可以获取页面上不同文章的共享计数 我为每个URL打开一个XHR,获取它的图形结果,将响应解析为JSON并获取共享。然后,我通过一个缩写算法运行共享号,以获得更友好的数字 当前的问题是,当for循环运行时,它会一个接一个地打开所有XHR,然后只继续处理最后一个生成的XHR。不知怎的,其他XHR都被抛弃了 我如何确保我得到所有请求的结果 var counters=document.getElementsByClassName'box-counter'; 对于变量i=0,n=count

我有一段代码,可以获取页面上不同文章的共享计数

我为每个URL打开一个XHR,获取它的图形结果,将响应解析为JSON并获取共享。然后,我通过一个缩写算法运行共享号,以获得更友好的数字

当前的问题是,当for循环运行时,它会一个接一个地打开所有XHR,然后只继续处理最后一个生成的XHR。不知怎的,其他XHR都被抛弃了

我如何确保我得到所有请求的结果

var counters=document.getElementsByClassName'box-counter'; 对于变量i=0,n=counters.length;ipower-1&&powerIndex
XHR.onreadystatechange = (function(elt, req) {
    return function() {
        if (req.readyState == 4 && req.status == 200) {
            elt.innerHTML = friendlyExpress(JSON.parse(req.responseText).shares);
        }
    };
}(element, XHR));
问题在于onreadystatechange处理程序是一个引用XHR和元素当前值的闭包。由于这些在每次循环迭代时都会发生更改,所以每个处理程序在执行时都会引用XHR和元素的最新值。由于循环可能在第一个请求完成之前退出,因此所有处理程序都引用最后分配的值。要解决这个问题,您需要在声明处理程序时捕获XHR和元素的当前值。最简单的方法是使用,您还可以创建一个单独的函数来返回所需的函数,并避免使用错误的变量创建闭包:

XHR.onreadystatechange = (function(elt, req) {
    return function() {
        if (req.readyState == 4 && req.status == 200) {
            elt.innerHTML = friendlyExpress(JSON.parse(req.responseText).shares);
        }
    };
}(element, XHR));