gpt4 book ai didi

Javascript 回调内部 map

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

当我尝试从 map 函数中的回调返回时,我当前遇到了问题。与异步代码的通常情况一样,映射函数在异步调用完成之前完成,这意味着我丢失了数据。

我可以在 map 函数中做什么来确保异步调用完成?我尝试仅从 Promise 返回,但似乎 Map 函数在到达末尾时返回 null。

在我的具体示例中,我尝试从 Yelp API 获取大量企业,然后对它们各自的地址进行地理编码,以便我可以将它们添加到我网站上的 Google map 中。

代码:

Q.Promise(function(resolve, reject, notify) {
yelp.search({
category_filter: 'food,restaurants',
location: city,
limit: 3,
sort: 2, // sort mode: 2=Highest Rated
}, function(error, data) {
if (error) {
reject(new Error(error));
}
else {
if (data['businesses'] && data['businesses'].length > 0) {
results = data['businesses'].map(function(business) {
sleep.usleep(500000); // sleep for 0.5 seconds so as not to get throttled by google
address = business.location.display_address.join(', ');
geocoder.geocode(address)
.then(function(res) {
return {
img_url: business.image_url,
name: business.name,
url: business.url,
rating_img_url: business.rating_img_url,
address: address,
coords: [res[0]['latitude'], res[0]['longitude']],
}
})
.catch(function(err) {
console.log('Could not geocode: ' + err);
return;
});
});
resolve(results);
}
}
});
});

最佳答案

我讨厌建议一种不太“功能”的方法( see wikipedia ,特别是有关副作用的部分),但如果您愿意使用一个简单的循环来改变对象属性,它应该可以解决问题:

data.forEach(function(business) {
// code removed
.then(function(res) {
business.businesses = /* the new object */
})
// code removed

在上述方法中,您只需迭代 data 并改变当前迭代的 business 的相应 businesses 属性。

我认为大多数其他方法可能有点复杂/困惑,所以这可能是“两害相权取其轻”类型的事情。其他选项包括将所有 Promise 存储在新数组中,并使用 Q.allSettled 之类的内容将它们与适当的 Business 属性相匹配。但不确定这是否是最佳方法。

关于Javascript 回调内部 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32086468/

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