2016-09-30 28 views
0

我有一个XMLHttpRequest(工作正常)的数组,我想知道它们什么时候全部完成。我写了以下关于readystatechange函数的数组:做一个on readystage函数的数组

xhr[i].open('post', 'PHP/write_and_exec_opt.php'); 
display_opt[i] = xhr[i].onreadystatechange = function(index) { 
    if (xhr[index].readyState == 4 && xhr[index].status == 200) { 
     text = xhr[index].responseText.trim(); 
     n_finished++; 
     console.log('display_opt', n_finished); 
    } 
    xhr[index].send(data); 
}(i); 

xhr请求正确执行。但控制台日志中没有输出。为什么不?

+0

它看起来像你试图在循环中使用[闭包](http://stackoverflow.com/q/750486/1048572)?看看[this](http://stackoverflow.com/a/25267864/1048572) – Bergi

回答

0

非常接近,但通过执行你的匿名函数,你最终的返回值分配给onreadystatechange财产。你永远不会返回一个值,所以你指定undefined。你可能想回功能:

xhr[i].open('post', 'PHP/write_and_exec_opt.php'); 
display_opt[i] = xhr[i].onreadystatechange = function(index) { 
    return function() { 
     if (xhr[index].readyState == 4 && xhr[index].status == 200) { 
      text = xhr[index].responseText.trim(); 
      n_finished++; 
      console.log('display_opt', n_finished); 
     } 
    }; 
}(i); 
xhr[i].send(data); 

这就是说,它变得扑朔迷离快,而且也没有充分的理由重复创建临时的功能,这就是为什么我通常打破东西出来:前

某处(或之后,但在相同的基本范围任何情况下)你i循环:

function createStateChangeHandler(index) { 
    return function() { 
     if (xhr[index].readyState == 4 && xhr[index].status == 200) { 
      text = xhr[index].responseText.trim(); 
      n_finished++; 
      console.log('display_opt', n_finished); 
     } 
    }; 
} 
i循环

然后:

xhr[i].open('post', 'PHP/write_and_exec_opt.php'); 
display_opt[i] = xhr[i].onreadystatechange = createStateChangeHandler(i); 
xhr[i].send(data); 

对于它的价值,我会建议寻找到使用承诺为这样的事情,ESP。现在,他们是JavaScript的一个标准部分(如ES2015的):

Promise.all(xhrArray.map(function(xhr) { 
    return new Promise(function(resolve, reject) { 
     xhr.onreadystatechange = function() { 
      if (xhr.readyState == 4) { 
       if (xhr.status == 200) { 
        resolve(xhr.responseText.trim()); 
       } else { 
        reject(/*...include some error perhaps...*/); 
       } 
      } 
     }; 
     xhr[index].send(data); 
    }); 
}) 
.then(function(array) { 
    // `array` contains an array o the results, in the same 
    // order as `xhrArray` 
}) 
.catch(function() { 
    // At least one XHR failed 
}); 
0

你有2个问题

  1. 没有,也就是当你阵XMLHttpRequest结束赶上没有内置方法。你需要自己实现它

  2. 你没有输出,因为你没有分配功能onreadystatechange,你分配函数的执行返回值(undefined在你的情况)。

相关问题