Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 根据阵列的大小进行多个api调用_Node.js_Api_Asynchronous_Promise_Request - Fatal编程技术网

Node.js 根据阵列的大小进行多个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) {

我试图根据数组中的信息进行多个API调用。例如,我有一个数组[‘伦敦’、‘纽约’、‘墨西哥’、‘中国’、‘东京’]

我想使用开放天气api获取所有天气。我试着用承诺。在渲染到前端之前,我需要返回所有数据,但我的代码无法工作

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 call
request
中以及当请求返回call
resolve
时,为每个城市创建一个承诺。使用
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 call
request
中以及当请求返回call
resolve
时,为每个城市创建一个承诺。使用
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将不会运行。