gpt4 book ai didi

javascript - for循环在node js中返回null

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:33 25 4
gpt4 key购买 nike

我正在使用谷歌API来获取3个字段,名称评级和地点评论。由于地点审核使用另一个 api 调用,因此我将其创建为一个函数来获取 place_review 中的数据。

response.results.forEach((entry)=>{
var restaurantName = {
"name" : entry.name,
"rating" : entry.rating,
"place_review" : placeReview(entry.place_id)
}
arr.push(restaurantName);
console.log(restaurantName);// shows only name and rating
});

额外功能

function placeReview(place_id){
console.log(place_id) // i see all place id via forloop.
googlePlaces.placeDetailsRequest({placeid: place_id},function(error,response){
if (error) throw error;
return response.result.reviews[0].text;
});
}

当我运行代码时,我得到name:somename rating:4.5place_review:null

我认为 forloop 会调用该函数,并且该函数的返回会将字符串附加到“place_review”,不确定我做错了什么。

最佳答案

placeDetailsRequest API 是异步的,这意味着它会启动但不会立即完成。因此,该行:

返回response.result.reviews[0].text;

毫无意义,因为没有什么可返回的。

您的 console.log(restaurantName); 将在请求完成之前运行,因此您只会得到“未定义”。

要解决这个问题,您需要做一些更复杂的事情(假设,目前 Promise 是您不熟悉的东西,但一旦人们熟悉了异步编程的工作方式,这通常就是人们所采用的方式):

response.results.forEach((entry)=>{
var restaurantName = {
"name" : entry.name,
"rating" : entry.rating,
"place_review" : undefined // will be filled in later
}
placeReview(entry.place_id, restaurantName);
});

function placeReview(place_id, obj){
console.log(place_id) // i see all place id via forloop.
googlePlaces.placeDetailsRequest({placeid: place_id},function(error,response){
if (error) throw error;
obj.place_review = response.result.reviews[0].text;
console.log(obj);
});
}

当然,您只会在每个请求完成时看到控制台结果。

这使用一种称为“回调”的技术来管理仅在以后可用的信息。网上和 SO 上有很多关于此的信息。

这是一个版本,您可以运行它来查看该技术的实际应用 - 与上面非常相似,但硬连接了一些数据。

var list = [
{ name: 'Aaron', rating: '14', place_id: 21 },
{ name: 'Brad', rating: '33', place_id: 33 }
];

list.forEach(function (entry) {
var restaurantName = {
"name" : entry.name,
"rating" : entry.rating,
"place_review" : undefined // will be filled in later
};
placeReview(entry.place_id, restaurantName);
});

function placeDetailsRequest(idObj, cb) {
setTimeout(function() {
var result = (idObj.placeid === 21) ? 'def' : 'abc';
cb(null, { result: { reviews: [{ text: result}]}});
}, 2000);
}

function placeReview(place_id, obj) {
console.log(place_id); // i see all place id via for loop.
placeDetailsRequest( { placeid: place_id }, function(error,response){
if (error) throw error;
obj.place_review = response.result.reviews[0].text;
console.log(obj);
});
}

进一步编辑以显示 promise 解决方案:

var list = [
{ name: 'Aaron', rating: '14', place_id: 21 },
{ name: 'Brad', rating: '33', place_id: 33 }
];

var allPromises = list.map(function (entry) {
var restaurantName = {
"name" : entry.name,
"rating" : entry.rating,
"place_review" : undefined // will be filled in later
};
return placeReview(entry.place_id, restaurantName);
});

Promise.all(allPromises)
.then(results => console.log(results))
.catch(error => console.log(error));

function placeReview(place_id, obj) {
return new Promise((resolve, reject) => {
// Here's where you would do your google api call to placeDetailsRequest
// if error then reject the promise, otherwise resolve it with your results
//googlePlaces.placeDetailsRequest({placeid: place_id},function(error,response){
// if (error) {
// reject(error);
// } else {
// obj.place_review = response.result.reviews[0].text;
// resolve(obj);
// }
//});

// simulating with delayed response
setTimeout(() => {
var result = (place_id === 21) ? 'def' : 'abc';
obj.place_review = result;
resolve(obj);
}, 2000);
});
}

还有其他方法可以解决这个问题,但在这个解决方案中,我用已完成的对象来解决 promise 。 Promise.all() 函数 then 要么显示成功结果,要么 catch 将显示错误。

关于javascript - for循环在node js中返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42771547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com