2016-05-13 3 views
2

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が複数回呼び出されて以来、より多くのスロットが割り当てられると考えました。これをどうやって解決するのですか?

+0

'gen'は関数の終わりに達し、したがって_done_です(これは実際にXHRを簡素化するのではなく、ロード/エラーをリッスンし、それらを約束として書くことができます) –

答えて

3

ジェネレータ関数を呼び出すと、最初のyield文まで実行され、次にnextメソッドが呼び出されるまで一時停止します。その後、別のyieldステートメントが発生するか、関数が関数を終了するまで実行を続けます。後者の場合、nextメソッドへのすべての呼び出しはundefinedを返します。

何がしたいことは、各繰り返しでXHRのreadyStateをチェックするループです:

function *statechange() { 
    while(true) { // loop forever 
    yield xhr.readyState; 
    } 
} 

あなたはPythonでジェネレータに精通している場合、これはまったく同じです。

私は、これがxhrsを単純化するわけではないという@Paul S.のコメントを2番目に書きます。その約束をチェックしてください。

関連する問題