TS2504

Type 'Promise' must have a 'Symbol.asyncIterator' method that returns an async iterator.

Broken Code ❌

const resource: string = 'https://api.polygon.io/v2/aggs/ticker/AAPL/range/1/minute/2023-01-09/2023-01-09';
const results: ResponseData['results'] = [];
 
const fetchDataGenerator = fetchData(resource);
 
for await (const payload of fetchDataGenerator) {
  results.push(...payload.results);
}
 
async function fetchData(address: string): Promise<ResponseData> {
  const url = new URL(address);
  url.searchParams.append('limit', '200');
  const response = await fetch(url);
  const payload = (await response.json()) as ResponseData;
  return payload;
}

Fixed Code ✔️

Make sure that fetchDataGenerator returns an AsyncGenerator. When using the function* syntax, this will be the case:

const resource: string = 'https://api.polygon.io/v2/aggs/ticker/AAPL/range/1/minute/2023-01-09/2023-01-09';
const results: ResponseData['results'] = [];
 
const fetchDataGenerator = fetchData(resource);
 
for await (const payload of fetchDataGenerator) {
  results.push(...payload.results);
}
 
async function* fetchData(address: string) {
  let url: URL | undefined = new URL(address);
 
  while (url) {
    console.log(url.origin);
    url.searchParams.append('limit', '200');
 
    const response = await fetch(url);
    const payload = (await response.json()) as ResponseData;
    yield payload;
 
    if (payload.next_url) {
      url = new URL(payload.next_url);
    } else {
      url = undefined;
    }
  }
}