非同期イテレーター — for await...ofとasyncジェネレーター
asyncジェネレーターとfor await...ofで時間をかけて到着する値を利用します。Symbol.asyncIteratorと簡単な非同期パイプラインを学びます。
「非同期イテレーター — for await...ofとasyncジェネレーター」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全3レッスンが含まれています。
非同期反復が必要な理由
目標: 後から到着する可能性のある値を消費します。
- for await...of は非同期イテラブルを反復します
- async function* は非同期ジェネレーターを作成します
- Symbol.asyncIterator はオブジェクトを非同期イテラブルとして示します
- 小さな非同期 map の例

async function* と for await...of
非同期ジェネレーター(async function*)は値を yield し、for await...of がその値を消費します。
// Use an async generator to yield values (could be delayed in real apps)
(async function () {
async function* countAsync(n) {
for (let i = 1; i <= n; i = i + 1) {
// In real code you could await a delay or I/O here
yield i;
}
}
for await (const x of countAsync(3)) {
console.log("async value:", x);
}
})();
手動で非同期 next() を呼び出す
非同期イテレーターの next() は、{ value, done } に解決される promise を返します。
// Drive an async iterator manually with await it.next()
(async function () {
async function* two() {
yield "A";
yield "B";
}
const it = two();
console.log(await it.next()); // { value: "A", done: false }
console.log(await it.next()); // { value: "B", done: false }
console.log(await it.next()); // { value: undefined, done: true }
})();
オブジェクトの Symbol.asyncIterator
[Symbol.asyncIterator]() を追加して非同期イテレーターを返すと、オブジェクトを for await...of で扱えるようになります。
// Mark a plain object as async-iterable via Symbol.asyncIterator
(async function () {
const AsyncTwice = {
from: function (a, b) {
return {
a: a, b: b,
[Symbol.asyncIterator]: async function () {
let step = 0;
return {
next: async function () {
if (step === 0) { step = 1; return { value: a, done: false }; }
if (step === 1) { step = 2; return { value: b, done: false }; }
return { value: undefined, done: true };
}
};
}
};
}
};
for await (const v of AsyncTwice.from("X", "Y")) {
console.log("from object:", v);
}
})();
非同期 map パイプライン
非同期ジェネレーターを組み合わせて、各処理を await する小さなパイプラインを構築します。
// Async map: transform values lazily while awaiting work
(async function () {
async function* countAsync(n) {
for (let i = 1; i <= n; i = i + 1) {
yield i;
}
}
async function* asyncMap(iterable, fn) {
for await (const v of iterable) {
// fn can be async; await its result
const out = await fn(v);
yield out;
}
}
const doubled = asyncMap(countAsync(4), async function (x) {
// simulate async transform (no real delay for demo)
return x * 2;
});
const collected = [];
for await (const v of doubled) {
collected.push(v);
}
console.log("doubled async:", collected);
})();
よい習慣
ヒント:
- for await...of には 非同期イテラブル(Symbol.asyncIterator)が必要です。
- async function* を使うと、非同期ジェネレーターを簡単に定義できます。
- 各 next() は await されます。応答性を保つため、処理は小さくしてください。

非同期イテラブルの基本クイズ
簡単な確認: 非同期イテラブルに必要な条件です。

まとめ
まとめ: async function* と yield を使って非同期ジェネレーターを作成します。for await...of でループするか、next() を手動で await します。ヘルパージェネレーターを使って小さな非同期パイプラインを構築します。

よくある質問
「非同期イテレーター — for await...ofとasyncジェネレーター」レッスンは無料ですか?
はい。「非同期イテレーター — for await...ofとasyncジェネレーター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全3レッスンが含まれています。
「非同期イテレーター — for await...ofとasyncジェネレーター」で何を学びますか?
asyncジェネレーターとfor await...ofで時間をかけて到着する値を利用します。Symbol.asyncIteratorと簡単な非同期パイプラインを学びます。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
JavaScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。
「非同期イテレーター — for await...ofとasyncジェネレーター」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJavaScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 反復可能プロトコルとfor...of
- ジェネレーター関数、yield、小さなパイプライン
- 非同期イテレーター — for await...ofとasyncジェネレーター