Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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
Javascript 如何将多个API调用响应传递给前端和循环_Javascript_Arrays_Node.js_Api_Promise - Fatal编程技术网

Javascript 如何将多个API调用响应传递给前端和循环

Javascript 如何将多个API调用响应传递给前端和循环,javascript,arrays,node.js,api,promise,Javascript,Arrays,Node.js,Api,Promise,我不熟悉javascript,试图在网上找到答案,但还是停留在这里 尝试使用GooglePlacesAPI通过“Promise”函数获取多个位置的数据,然后只提取所有位置的“reviews”部分。 将结果渲染到前端后,我得到: [对象对象],[对象对象对象],[对象对象],[对象对象对象],[对象对象],[对象对象对象],[对象对象对象],[对象对象对象],[对象对象],[对象对象对象],[对象对象对象],[对象对象对象对象],[对象对象对象对象] 如果我使用console.log(result

我不熟悉javascript,试图在网上找到答案,但还是停留在这里

尝试使用GooglePlacesAPI通过“Promise”函数获取多个位置的数据,然后只提取所有位置的“reviews”部分。 将结果渲染到前端后,我得到:

[对象对象],[对象对象对象],[对象对象],[对象对象对象],[对象对象],[对象对象对象],[对象对象对象],[对象对象对象],[对象对象],[对象对象对象],[对象对象对象],[对象对象对象对象],[对象对象对象对象]

如果我使用console.log(results),我可以在终端中看到结果,但在前端只能得到多个[object]

app.js文件:

var express = require("express");
var app = express();
var request = require("request");
var bodyParser = require("body-parser");

//APP CONFIG
app.set("view engine", "ejs");
app.use(express.static("public"));
app.use(bodyParser.urlencoded({extended: true}));


// fakes request
function request(url, cb) {
  setTimeout(() => cb(null, 200, `{"Search": "success for ${url}" }`), 200)
}


let locations = ['ChIJd5X4zalZwokR8HwFrpqhZTM', 'ChIJUQgmLP5YwokRaXhfzBfk0wY', 'ChIJ34UGSqNZwokR8PYj2UiNZ2k']

// promisesArray will hold all the promises created in map()
app.get("/resultspage", function(req, res){
  let promisesArray = locations.map(location => {
  // make a new promise for each element of cities
  return new Promise((resolve, reject) => {
    let url = 'https://maps.googleapis.com/maps/api/place/details/json?key=APIKEYHERE&placeid=' + location
    request(url, function(error, response, body) {
      if (error) {
        reject(error);
      }
      var data = JSON.parse(body)
      var results = data.result.reviews;
      // resolve once we have some data
      resolve(results);
    });
  })
})
Promise.all(promisesArray)
  .then(function(results) {
    console.log(results)
      res.render("resultspage", {data: results});
  })
  .catch(function(error) {
    console.log(error)

  })
})


app.listen(process.env.PORT, process.env.IP, function(){
    console.log("app has started!!");
});
resultspage.ejs文件

<h1>Results Page</h1>

<%= data %>
结果页面
以下是指向Google Place详细信息网页的链接:

谢谢

排队

<%= data %>

EJS希望两个括号之间有一个字符串。您传递给它的是一个对象数组,它被字符串化以生成您所看到的内容。相反,您可以尝试将其解包,直到将所需字段放入一个巨大的字符串中:

<%= data.map(review => review.author_name).join(',') %>
review.author_name).join(',')%>
(或者,当然,您可以使my map and join函数更复杂,以添加HTML标记和样式。)

您可以直接使用,而不是将回调转换为承诺

var rp = require('request-promise');

app.get("/resultspage", function (req, res) {
    Promise.all(locations.map(location => rp('https://maps.googleapis.com/maps/api/place/details/json?key=APIKEYHERE&placeid=' + location)))
        .then(function (results) {
            results = results.map(result => {
                var data = JSON.parse(body)
                return data.result.reviews;
            });
            console.log(results)
            res.render("resultspage", {
                data: JSON.stringify(results)
            });
        })
        .catch(function (error) {
            console.log(error)
        })
})

我认为您只需要在前端使用JSON.stringify“重新打包”即可。谢谢。如果我使用JSON,我会得到混乱的文本,如下面的链接:谢谢。如果我使用,我会得到混乱的文本,如下面的链接:所以它基本上是一个数组,里面有3个数组,每个数组有5个对象。如果我只需要从3个位置的每个评论中提取作者姓名(总共15个作者姓名),我应该在前端使用什么代码?谢谢你,我仔细考虑了你的建议,我想我应该能够找到答案。使用以下代码:
  • 查看[i].text.join(',')%>