2016-09-30 6 views
0

私はXMLHttpRequestの配列を持っています(正常に動作しています)。 readystatechange関数に関する次の配列を書きました:読み取り機能の配列を行います

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ループ:あなたの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); 
     } 
    }; 
} 

何が価値があるために
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)を割り当てます。

関連する問題