Node.js 根据阵列的大小进行多个api调用
我试图根据数组中的信息进行多个API调用。例如,我有一个数组[‘伦敦’、‘纽约’、‘墨西哥’、‘中国’、‘东京’] 我想使用开放天气api获取所有天气。我试着用承诺。在渲染到前端之前,我需要返回所有数据,但我的代码无法工作Node.js 根据阵列的大小进行多个api调用,node.js,api,asynchronous,promise,request,Node.js,Api,Asynchronous,Promise,Request,我试图根据数组中的信息进行多个API调用。例如,我有一个数组[‘伦敦’、‘纽约’、‘墨西哥’、‘中国’、‘东京’] 我想使用开放天气api获取所有天气。我试着用承诺。在渲染到前端之前,我需要返回所有数据,但我的代码无法工作 let cities = ['London', 'New York', 'Mexico', 'China', 'Tokyo'] let promisesArray = [] return new Promise(function(resolve, reject) {
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) {
})
let cities=[‘伦敦’、‘纽约’、‘墨西哥’、‘中国’、‘东京’]
让允诺者雷=[]
返回新承诺(功能(解决、拒绝){
for(设i=0;i
你把一些事情搞混了,但这是正确的想法。您的promiseArray
需要包含承诺,而不是数据
因此,您应该遍历您所在的城市,在promise callrequest
中以及当请求返回callresolve
时,为每个城市创建一个承诺。使用array.map比使用for
循环更简洁
下面是一个模拟的请求
函数的示例:
//伪造请求
函数请求(url、cb){
setTimeout(()=>cb(null,200,`{“Search”:“successfor${url}”}`),200)
}
let cities=[‘伦敦’、‘纽约’、‘墨西哥’、‘中国’、‘东京’]
//promisesArray将持有map()中创建的所有承诺
let promisesArray=城市。地图(城市=>{
//为城市的每个元素做出新的承诺
返回新承诺((解决、拒绝)=>{
让url为空http://api.openweathermap.org/data/2.5/weather?q=“+城市
请求(url、函数(错误、响应、正文){
如果(错误){
拒绝(错误);
}
var data=JSON.parse(正文)
var results=data.Search;
//一旦我们有了一些数据,就解决问题
决心(结果);
});
})
})
全部承诺(承诺)
.然后(函数(结果){
console.log(结果)
})
.catch(函数(错误){
console.log(错误)
})
你把一些事情搞混了,但这是正确的想法。您的promiseArray
需要包含承诺,而不是数据
因此,您应该遍历您所在的城市,在promise callrequest
中以及当请求返回callresolve
时,为每个城市创建一个承诺。使用array.map比使用for
循环更简洁
下面是一个模拟的请求
函数的示例:
//伪造请求
函数请求(url、cb){
setTimeout(()=>cb(null,200,`{“Search”:“successfor${url}”}`),200)
}
let cities=[‘伦敦’、‘纽约’、‘墨西哥’、‘中国’、‘东京’]
//promisesArray将持有map()中创建的所有承诺
let promisesArray=城市。地图(城市=>{
//为城市的每个元素做出新的承诺
返回新承诺((解决、拒绝)=>{
让url为空http://api.openweathermap.org/data/2.5/weather?q=“+城市
请求(url、函数(错误、响应、正文){
如果(错误){
拒绝(错误);
}
var data=JSON.parse(正文)
var results=data.Search;
//一旦我们有了一些数据,就解决问题
决心(结果);
});
})
})
全部承诺(承诺)
.然后(函数(结果){
console.log(结果)
})
.catch(函数(错误){
console.log(错误)
})
为什么使用退货?如果在函数内部,Promise.all在代码中不会运行。为什么使用return?如果在函数内部,则代码中的Promise.all将不会运行。