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;
}
}
}