2016-08-06 8 views
1

私はこのコードを持っている:私はそれを実行するとsetTimeoutの内部から取得した値にはどうすればアクセスできますか?

function* showValue() { 
    setTimeout(function*() { 
    console.log('yielding') 
    return yield 100; 
    }, 1000); 
} 

var valFunc = showValue(); 
console.log(valFunc.next()); 

は、私はこの出力を参照してください。

{ value: undefined, done: true } 

はなぜ.next()コールリターン100を持つようにすればよいですか?

+0

'setTimeout'が、それは後の時点で完了し、そのようにあなたはそれから戻ることができない、非同期です。あなたのケースでは、おそらくタイマーがそれをしたことを知ってコールバックや約束を必要とするだろう。 – adeneo

+0

本当に、ジェネレータについてまだ理解していないものがあるかもしれませんが、 'showValue'が一時停止すると、setTimeoutの中でさえどこから降伏しても実行を再開すると思っていました。 – Geo

+0

setTimeoutはid番号以外の何も返しませんが、setTimeoutへのコールバックとして提供される匿名ジェネレータ関数は、時刻が来たときに実行され、返されるジェネレータオブジェクトは失われます。あなたはsetTimeout内でそれをキャプチャし、それに応じて使用する必要があります。 – Redu

答えて

1

次のようにコードを変更すると思います。

function showValue() { 
 
    return setTimeout(function() { function* gen() { 
 
            console.log('yielding'); 
 
            yield 100; 
 
           } 
 
           var it = gen(); 
 
           console.log(it.next().value); 
 
           }, 1000); 
 
} 
 
showValue();    // will display result after 1000+ms 
 
console.log(showValue()); // will immediately display setTimeout id and after 1000+ms will display the generator yielded value again.

+0

'console.log(showValue())'を実行したときに値が表示されるように、これを修正する方法はありますか? – Geo

+1

できません。 setTimeoutは非同期関数です。 showValueを呼び出すと、setTimeoutが呼び出され、何かをする時間がかかります(id以外のものは返されません)。console.log(setTimeout())を呼び出すと、ジェネレータ関数はまだ待機していますイベントキューに入れられ、少なくとも1000ms後に呼び出されます。だからあなたが実行したいものは、非同期のタイムラインに連鎖する必要があります。私はあなたが事実を知ることができることを期待してコードを修正します。 – Redu

関連する問題