Javascript 在数组中异步循环会更改不同索引的值
我有一个异步循环,它发送索引值以保存结果。但是,由于某些原因,此项第一次循环时,会正确记录值。第二次循环。它更改第一个循环中的值和第二个循环中的值,依此类推。它似乎根据输入不一致地执行此操作 下面是代码Javascript 在数组中异步循环会更改不同索引的值,javascript,loops,asynchronous,google-maps-api-3,Javascript,Loops,Asynchronous,Google Maps Api 3,我有一个异步循环,它发送索引值以保存结果。但是,由于某些原因,此项第一次循环时,会正确记录值。第二次循环。它更改第一个循环中的值和第二个循环中的值,依此类推。它似乎根据输入不一致地执行此操作 下面是代码 promises[address_key] = addresses[address_key].nearest.map(function(currentValue, charger_key) { // This loops through items creating promises ret
promises[address_key] = addresses[address_key].nearest.map(function(currentValue, charger_key) { // This loops through items creating promises
return new Promise(function(resolve) {
addresses[address_key].nearest[charger_key].directions = get_driving_directions(addresses[address_key].nearest[charger_key]);
addresses[address_key].nearest[charger_key].map_img = get_static_map_url(addresses[address_key].nearest[charger_key]);
get_driving_distance(address_key, charger_key, resolve); // this calls the get_driving_distance function below
});
});
/* more code here */
// Calls distance matrix from Google's api.
function get_driving_distance(address_key, charger_key, resolve) {
var distance_matrix = new google.maps.DistanceMatrixService();
distance_matrix.getDistanceMatrix( // calls distance matrix in Google API
{
origins: [addresses[address_key].address],
destinations: [new google.maps.LatLng(addresses[address_key].nearest[charger_key].latitude, addresses[address_key].nearest[charger_key].longitude)],
unitSystem: google.maps.UnitSystem.IMPERIAL,
travelMode: 'DRIVING'
}, process_distance_matrix(address_key, charger_key, resolve) // calls process_distance_matrix function sending over variables necessary.
);
}
// processes data from the distance matrix in the function get_driving_distance
function process_distance_matrix(address_key, charger_key, callback) {
return function(response, status) {
if (response.rows[0].elements[0].status == 'OK') {
console.log("response", response, 'status', status, 'address_key', address_key, 'charger_key', charger_key);
console.log("Records before:", addresses[0].nearest[0].distance, response.rows[0].elements[0].distance.text, 'address_key', address_key, 'charger_key', charger_key);
// Update the global variable with the distance data. This is recording data in wrong fields.
addresses[address_key].nearest[charger_key].distance = {
'text': response.rows[0].elements[0].distance.text,
'number': response.rows[0].elements[0].distance.value / 1609.344,
'over_limit': (max_driving_distance ? (response.rows[0].elements[0].distance.value / 1609.344 > max_driving_distance) : false)
};
console.log("Records after:", addresses[0].nearest[0].distance, response.rows[0].elements[0].distance.text, 'address_key', address_key, 'charger_key', charger_key);
} else {
display_error(address_key + ') ' + addresses[address_key].address + ' - Error getting driving distance');
addresses[address_key].errors.push('Error getting driving distance');
progress_status.error++;
}
callback();
}
}
代码的其余部分太多,无法发布,因此这里有一个指向代码其余部分的链接:
原始循环是第68行上的for循环。这将遍历地址并传递地址_键以引用全局对象
第183行有第二个环路。这是一个.map循环。它通过充电器运行,并传递充电器_键以引用全局对象
注意控制台。日志在函数的中间。这些是为了显示变量在不应该发生变化的地方是如何变化的。每次声明之前和之后都会显示有问题的对象。它还显示执行时的地址键和充电器键
任何帮助都将不胜感激。我认为问题在
过程地址中:
addresses[address_key].nearest = charger_data.sort( sort_by_closest( addresses[address_key].geo ) );
// Takes the top results based on the number of results wanted.
addresses[address_key].nearest = addresses[address_key].nearest.slice(0, $('#number_of_results').val() );
如果同一充电器靠近多个地址,则该充电器将位于所有地址最近的阵列中。因此,当您从一个地址向充电器添加行驶方向时,您正在替换以前地址中的方向
有两种解决方案:
最简单的方法是在将充电器对象放入最近的数组之前克隆它们
addresses[address_key].nearest = addresses[address_key].nearest.slice(0, $('#number_of_results').val()).map(function(charger) {
return $.extend({}, charger);
});
另一种方法是使用不同的对象来保持方向,并使充电器成为其属性:
addresses[address_key].nearest = addresses[address_key].nearest.slice(0, $('#number_of_results').val()).map(function(charger) {
return { charger: charger };
});
这是惠勒著名格言的一个应用:“计算机科学中的所有问题都可以通过另一种间接方式来解决。”
(使用第一种解决方案)我认为问题在过程地址中:
addresses[address_key].nearest = charger_data.sort( sort_by_closest( addresses[address_key].geo ) );
// Takes the top results based on the number of results wanted.
addresses[address_key].nearest = addresses[address_key].nearest.slice(0, $('#number_of_results').val() );
如果同一充电器靠近多个地址,则该充电器将位于所有地址最近的阵列中。因此,当您从一个地址向充电器添加行驶方向时,您正在替换以前地址中的方向
有两种解决方案:
最简单的方法是在将充电器对象放入最近的数组之前克隆它们
addresses[address_key].nearest = addresses[address_key].nearest.slice(0, $('#number_of_results').val()).map(function(charger) {
return $.extend({}, charger);
});
另一种方法是使用不同的对象来保持方向,并使充电器成为其属性:
addresses[address_key].nearest = addresses[address_key].nearest.slice(0, $('#number_of_results').val()).map(function(charger) {
return { charger: charger };
});
这是惠勒著名格言的一个应用:“计算机科学中的所有问题都可以通过另一种间接方式来解决。”
(使用第一种解决方案)这段代码中的循环在哪里?有太多的代码在试图找到问题,但我敢打赌它类似于@Barmar是的,它有点复杂。环路在183号线到189号线。我在那里没有看到环路。没有用于或while
语句,也没有调用forEach()
。啊,现在我看到了对.map()
的调用。这段代码中的循环在哪里?有太多的代码在试图找到问题,但我敢打赌它类似于@Barmar是的,有点复杂。环路在183号线到189号线。我在那里没有看到环路。没有用于或while
语句,也没有调用forEach()
。啊,现在我看到调用.map()
。谢谢你,巴尔马!成功了!你是一个密码绝地!!!我将帮助传播你的惊人技能和你今天所做的好事!再次感谢!!谢谢你,巴尔马!成功了!你是一个密码绝地!!!我将帮助传播你的惊人技能和你今天所做的好事!再次感谢!!