【发布时间】:2018-02-14 01:16:55
【问题描述】:
我正在使用 Geocodio,它是基于回调的地理编码。我有一个对象数组,每个对象都嵌套了一个餐厅对象。请参见下面的示例:
{
id: 0, title: "Half off all pizzas",
details:"Carry out only, all-day",
days: ["Monday", "Tuesday"],
restaurant: {
name: "Papa John's",
addressOne: "2937 Greenville Ave",
city: "Dallas",
state: "TX",
zip: 75206
}
}
我目前正在映射对象数组,以将每个餐厅的地址传递到地理编码函数中。然后,我想向该对象添加一个名为 location 的属性,该属性将包含地理编码的结果。但是,在函数的结果可以传递给对象之前,该元素被返回。见下文:
generateCoordinates (req, res, next) {
var newDeals = deals.map((cur, ind, arr) => {
location = new Promise (function(resolve, reject) {
geocodio.get('geocode', {q: `${cur.restaurant.addressOne},
${cur.restaurant.city}, ${cur.restaurant.state},
${cur.restaurant.zip}`}, function(err, response) {
if (err) {
reject(err)
throw err;
}
else {
var result = JSON.parse(response);
let obj = result.results[0].location;
// console.log(obj);
resolve(obj)
}
}
)}).then((obj) => {
cur.location = obj;
console.log(cur)
return cur;
})
return cur;
// console.log(newDeals)
})
res.status(200).send(newDeals)
},
我很可能在这里误用了 Promise 构造函数。 .then 中的 console.log 显示每个元素都正确添加了 location 属性,但响应和 console.log(newDeals) 将值显示为“Promise”。
如何设置数组中每个元素的位置属性?
【问题讨论】:
-
不,你没有滥用它,但你应该返回承诺并在返回的数组上使用
Promise.all。 -
geocodio.get()是否返回Promise?如果确实如此,您也许可以避免显式的 Promise 构造。 -
您可能不需要手动创建 Promise。如果您在节点 8+ 上,您可以使用
util.promisify将回调样式函数提升为基于 Promise 的函数。
标签: javascript arrays node.js geocoding es6-promise