spa*_*Dog 0 api asynchronous request node.js promise
我正在尝试根据数组中的信息进行多个 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) {
})
Run Code Online (Sandbox Code Playgroud)
您混淆了几件事,但这是正确的想法。您promiseArray需要包含承诺,而不是数据。
因此,您应该遍历您的城市,在 promise 调用中request以及当请求返回 call 时为每个城市创建一个 promise 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)
})Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
972 次 |
| 最近记录: |