ES6ジェネレーターでAJAX呼び出しを行う方法を簡素化しようとしています。しかし、私はいくつかの問題に実行しているよ:XMLHttpRequestでES6ジェネレーターを使用する
let xhr = new XMLHttpRequest()
function *statechange() {
yield xhr.readyState;
}
let gen = statechange();
xhr.open("GET", myUrl, true);
xhr.onreadystatechange = function() {console.log(gen.next())};
xhr.send();
を私は何をしようとしているのだけ簡単な説明:私は、各要求の状態変化のレディ状態を得たいです。ジェネレータの各繰り返しにreadyState
文字列を記録します。私はこのコードを実行すると、私は得る:
{value: 2, done: false}
{value: undefined, done: true}
{value: undefined, done: true}
どの、その表面が右に見えますが、私は昔ながらのXHR行う場合に:
//... new XMLHttpRequest()...
xhr.onreadystatechange = function() {console.log(xhr.readyState)}
を私が取得:
2
3
4
だから私はどこで発電機を使って間違っていますか?
UPDATE:
がさえ見知らぬ人、私は発電機でreadyState
をログインした場合:
// HERE
xhr.onreadystatechange = function() {console.log(xhr.readyState, gen.next())};
私はこの取得:
2, {value: 2, done: false}
3, {value: undefined, done: true}
4, {value: undefined, done: true}
をだから、この手段、正しいreadyState
は、next()
メソッドが呼び出されます。私は、yield
ステートメントはレジスタを1回しか使用しないと推測できます。そのため、ジェネレータは1つのスロットを割り当てます。私はonreadystatechange
が複数回呼び出されて以来、より多くのスロットが割り当てられると考えました。これをどうやって解決するのですか?
'gen'は関数の終わりに達し、したがって_done_です(これは実際にXHRを簡素化するのではなく、ロード/エラーをリッスンし、それらを約束として書くことができます) –