【发布时间】:2015-08-06 07:18:27
【问题描述】:
我正在从事一个个人项目,但我被困在一个看似“基本”的同步/异步 Javascript 问题上。
总而言之,我正在调用一个异步 API,然后将结果显示在屏幕上。
格式化后的期望结果是:“在距离 Y 的 X 公里处”,其中 X 是从 API 正确计算和返回的,Y 是地点的名称(未正确显示)。
这是我的代码,有一些 cmets 以便更好地理解:
//loadedLandmarks.length is **always** between 1 and 3. No exception.
//In this sample, let's say we have 3 items in loadedLandmarks
for(var i = 0 ; i < loadedLandmarks.length ; i++)
{
var currentLandmarkName = loadedLandmarks[i].customInfo.Name;
landmarksName.push(loadedLandmarks[i].customInfo.Name);
//landmarkName contains the good names, for example : "My school", "My home", "My favorite nightclub" (here after 3 pass on the loop)
console.log(landmarksName);
//DisplayDistanceFromLandmarks is my method which calls the asynchronous API. It seems OK.
DisplayDistanceFromLandmarks(pos, i).then(function(response) {
//The response variable contains correct informations from the API
var origins = response.originAddresses;
var destinations = response.destinationAddresses;
var results = response.rows[0].elements;
//I explain this line below
console.log(loadedLandmarks)
//Then I'm formatting the result to display it on screen (I only paste here the interesting part)
distances += "<br />At " + results[0].distance.value + "kms from" + currentLandmarkName;
return distances;
}).done( /*some other things*/ );
显示的结果是:
距离 [在此处插入最后一个当前地标名称] 5 公里
距离 [在此处插入最后一个当前地标名称] 8.5 公里
距离 [在此处插入最后一个当前地标名称] 0.2 公里
应该是这样的:
距离 [在此处插入第一个当前地标名称] 5 公里
距离 [在此处插入第二个当前地标名称] 8.5 公里
距离 [此处插入第三个当前地标名称] 0.2 公里
我不明白的是,当我写console.log(loadedLandmarks) 时,数组的内容是正确的,loadedLandmarks[0].Name = 第一个名字,loadedLandmarks[1].Name = 第二个名字等等。
但是,i 始终等于 3,currentLandmarkName 始终等于最后一个地标名称。
似乎它们被覆盖了,我不明白为什么。
我对 JS 和异步问题很陌生,有人能解释一下为什么我会遇到这种行为,而且非常重要的是,如何纠正它?
【问题讨论】:
标签: javascript asynchronous formatting synchronous