Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 在数组中异步循环会更改不同索引的值_Javascript_Loops_Asynchronous_Google Maps Api 3 - Fatal编程技术网

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()
。谢谢你,巴尔马!成功了!你是一个密码绝地!!!我将帮助传播你的惊人技能和你今天所做的好事!再次感谢!!谢谢你,巴尔马!成功了!你是一个密码绝地!!!我将帮助传播你的惊人技能和你今天所做的好事!再次感谢!!