yieldキーワードの主な目的は、非同期ループを作成するためにそれを使用することもかなり便利ですが、いくつかのデータの上にイテレータを提供することであるが:yieldをコールバックベースのループで使用する方法は?
function* bigLoop() {
// Some nested loops
for(...) {
for(...) {
// Yields current progress, eg. when parsing file
// or processing an image
yield percentCompleted;
}
}
}
これはその後、非同期的に呼び出すことができます。
function big_loop_async(delay) {
var iterator = big_loop();
function doNext() {
var next = iterator.next();
var percent_done = next.done?100:next.value;
console.log(percent_done, " % done.");
// start next iteration after delay, allowing other events to be processed
if(!next.done)
setTimeout(doNext, delay);
}
setTimeout(doNext, delay);
}
しかし、現代のjavascriptでは、コールバックベースのループがかなり普及しています。我々はArray.prototype.forEach
、Array.prototype.find
またはArray.prototype.sort
を持っています。これらのすべては、各反復ごとに渡されるコールバックに基づいています。可能ならばこれらを使用することが推奨されると聞いていました。なぜなら、ループの標準よりも最適化できるからです。
また、コールバックベースのループを使用して、複雑なループパターンを抽象化することもよくあります。
ここでの質問は、yield
ベースのイテレータにすることができますか?簡単な例として、配列を非同期でソートしたいと考えています。
、どんなメリットがありますか? –
@DavinTryonこれは* example *の例ですが、実際の例は分かりにくいものです。とにかく、配列が長すぎると並べ替えに時間がかかりすぎる可能性があります。たとえば、サーバーとの接続を切断したり、ユーザーのブラウザを遅らせることができます。 –
@TomášZatoこれは[良い記事]です(http://raganwald.com/2016/05/07/javascript-generators-for-people-who-dont-give-a-shit-about-getting-stuff-done .html)あなたは興味深い(不幸なタイトル)を見つけるかもしれません。そう、あなたのOPへの短い答え、それははいできます。 –