【发布时间】:2023-03-24 14:34:01
【问题描述】:
我正在练习一些更高级的 Javascript 技术,并且遇到了生成器和迭代器作为我想要研究的东西。我知道我做错了,但我不确定该怎么做。
我的小程序的想法是这样的:我想对四个(或更多,但我正在测试四个)城市的 OpenWeather API 进行 API 调用。城市被一个一个地存储在一个数组中,城市被附加到 URL 并发送一个获取请求。每个响应都附加到一个数组中,并将该数组发送给客户端。 这是我的原始代码:
// node/express setup here
const cities = ["London%2Cuk", "New York%2Cus", "Johannesburg%2Cza", 'Kingston%2Cjm']
const url = process.env.URL_BASE;
const headers = {
"X-RapidAPI-Host": process.env.HOST,
"X-RapidAPI-Key": process.env.API_KEY
}
const requestInit = { method: 'GET',
headers: headers
};
const fetchWeather = (ep) => {
const appendedURL = url + ep;
return fetch(appendedURL, requestInit)
.then(r => r.json());
}
app.get('/', (req, res, err) => {
const data = []
Promise.all(
cities.map( async (city) => {
await fetchWeather(city)
.then(returns => {
data.push(returns)
})
})
)
.then(() => {
res.send(data)
return data;
})
.catch(err => console.log(err))
})
对吗?固体,工作正常。但现在我被困在如何订购它上。我认为这样做的方法是将await fetchWeather(city) 切换到yield fetchWeather(city) 并拥有一个生成器管理器,它将继续调用next(city) 直到数组完成,但是我在找出模式时遇到了问题。我重构了对生成器的 api 调用,并正在测试生成器管理功能。
根据我的理解,我的范式是这样的:
- 第一个
.next()开始迭代 - 二号
.next(args)过指定城市到一号收益 - 第三个
.next()发送产生的获取请求并且应该(理想情况下)返回可以是.then()'d 的响应对象。
这是我的测试器生成器代码:
function *fetchWeather() {
for (let i = 0; i < cities.length; i++){
const appendedURL = url + (yield);
yield fetch(appendedURL, requestInit)
.then(r => {
return r.json()
});
}
}
const generatorManager = (generator) =>{
if (!generator) {
generator = fetchWeather();
}
generator.next()
generator.next(cities[i])
generator.next().value.then( e =>
console.log(e));
}
我收到一个错误:TypeError: Cannot read property 'then' of undefined 我不确定我的逻辑哪里出了问题。如果我不能单独传递已知值,我该如何重构它以允许我等待特定的承诺?我知道必须有办法,但我错过了一些东西。
提前致谢。
【问题讨论】:
标签: javascript asynchronous generator