根据数组的大小进行多次 api 调用
Posted
技术标签:
【中文标题】根据数组的大小进行多次 api 调用【英文标题】:making multiple api calls based on the size of the array 【发布时间】:2018-12-17 18:16:45 【问题描述】:我正在尝试根据数组中的信息进行多个 API 调用。例如,我有一个数组 ['London', 'New York', 'Mexico', 'China', 'Tokyo']
我想使用开放天气 api 获取所有天气。我正在尝试使用 promise.all。在渲染到前面之前,我需要返回所有数据,但是我的代码不起作用。
let cities = ['London', 'New York', 'Mexico', 'China', 'Tokyo']
let promisesArray = []
return new Promise(function(resolve, reject)
for(let i = 0; i < cities.length; i++)
let cities = ['London', 'New York', 'Mexico', 'China', 'Tokyo']
let url = 'api.openweathermap.org/data/2.5/weather?q=' + cities[i]
request(url, function(error, response, body)
if (err)
reject(error);
var data = JSON.parse(body)
var results = data.Search;
promisesArray.push(resolve(results));
);
)
Promise.all(promisesArray)
.then(function(results)
)
.catch(function(error)
)
【问题讨论】:
为什么要使用 return ?如果在函数内部,代码中的 Promise.all 将不会运行。 【参考方案1】:您有几件事混淆了,但这是正确的想法。您的 promiseArray
需要包含承诺,而不是数据。
所以你应该遍历你的城市,为每个城市创建一个承诺,在承诺调用 request
和当请求返回时调用 resolve
。 array.map
比 for
循环更简洁。
这是一个模拟 request
函数的示例:
// fakes request
function request(url, cb)
setTimeout(() => cb(null, 200, `"Search": "success for $url" `), 200)
let cities = ['London', 'New York', 'Mexico', 'China', 'Tokyo']
// promisesArray will hold all the promises created in map()
let promisesArray = cities.map(city =>
// make a new promise for each element of cities
return new Promise((resolve, reject) =>
let url = 'http://api.openweathermap.org/data/2.5/weather?q=' + city
request(url, function(error, response, body)
if (error)
reject(error);
var data = JSON.parse(body)
var results = data.Search;
// resolve once we have some data
resolve(results);
);
)
)
Promise.all(promisesArray)
.then(function(results)
console.log(results)
)
.catch(function(error)
console.log(error)
)
【讨论】:
以上是关于根据数组的大小进行多次 api 调用的主要内容,如果未能解决你的问题,请参考以下文章
Java API 调用将根据队列大小进行合并或在最旧项目插入队列后 4 秒内执行
RxJava Retrofit2 api 使用 subscribe 或 flatmap 多次调用
每秒进行多次调用时,Google API Client for Google BigQuery Call 的授权失败并出现错误 403