钛和Javascript匿名函数作用域
我试图在钛中调用<代码>转发地理编码器< /代码>函数,但是我在检索结果时遇到一些问题,请考虑下面的代码:-钛和Javascript匿名函数作用域,javascript,dom-events,titanium,Javascript,Dom Events,Titanium,我试图在钛中调用转发地理编码器< /代码>函数,但是我在检索结果时遇到一些问题,请考虑下面的代码:- x = 0; Ti.Geolocation.forwardGeocoder(startTextFieldContents, function(evt) { var startPin = Ti.Map.createAnnotation({ longitude : evt.longitude, latitude : evt.latitude
x = 0;
Ti.Geolocation.forwardGeocoder(startTextFieldContents, function(evt) {
var startPin = Ti.Map.createAnnotation({
longitude : evt.longitude,
latitude : evt.latitude,
pincolor : Ti.Map.ANNOTATION_GREEN
});
var startPinLocation = {
longitude : evt.longitude,
latitude : evt.latitude
}
mapview.addAnnotation(startPin);
x = 1;
});
Ti.API.log('X = ' + x);
如果你看一看X,当我注销它时,它总是等于0,即使我在我的匿名函数中将它设置为1,因为这是一个以匿名函数为参数的函数调用,我正在努力找出如何检索该值并使其在forwardGeocoder外部可用
为了解决这个问题,根据本文所说的,我使用了以下代码:
var completed = 0;
Ti.Geolocation.forwardGeocoder(startTextFieldContents, function(evt) {
var startPin = Ti.Map.createAnnotation({
longitude : evt.longitude,
latitude : evt.latitude,
pincolor : Ti.Map.ANNOTATION_GREEN
});
startPinLocation = {
longitude : evt.longitude,
latitude : evt.latitude
}
mapview.addAnnotation(startPin);
++completed;
if (completed === 1) {
Ti.Geolocation.forwardGeocoder(finishTextFieldContents, function(evt) {
var finishPin = Ti.Map.createAnnotation({
longitude : evt.longitude,
latitude : evt.latitude,
pincolor : Ti.Map.ANNOTATION_RED
});
finishPinLocation = {
longitude : evt.longitude,
latitude : evt.latitude
}
mapview.addAnnotation(finishPin);
mapview.addRoute({
name : 'Route',
points : [startPinLocation, finishPinLocation],
color : 'green',
width : 1
});
});
}
});
您可以按照Juhana的建议嵌套调用。问题是这太慢了。您等待来自服务器的往返,然后才开始下一次往返,并且只有在两次同步(即非并行)往返之后,您才能执行所需的任务。如果数据是相互依赖的,这将是必要的,尽管听起来它们不是 因此,您可以执行以下操作:
var completed = 0, values = [];
function handle(data){
values.push(data);
++completed;
if (completed === 2) {
dataReadySoLetsDoStuff();
}
}
fetchFromServer(params1, handle);
fetchFromServer(params2, handle);
function dataReadySoLetsDoStuff() {
// both values are ready
}
你看到它是如何异步工作的了吗?有一个小问题,您无法区分这些值,因为它们的顺序无法保证,但您可以轻松地更改句柄
(例如咖喱、绑定或包装)来解决这个问题
您可以使用其他方法,尽管它们都基于相同的想法-计算已完成的任务,直到我保证所有任务都已完成,然后执行我们想要执行的任务…这就像我评论的您的最后一个问题一样。它是异步的。因此,您必须开始使用事件驱动模型,而不是让代码逐行工作(这是您习惯的)。该值将在从服务器获取数据时的某个时间点可用。为此,您将传入一个函数,该函数中的值将可用,此后将传递给所有其他代码。然后,您的日志(以及值的使用)必须来自您传入的匿名函数。我理解您的意思,在上一期中,我能够在异步事件函数中使用我的日志来获取结果,这里的问题是我实际上运行了两个ForwardGeocoder,一个用于起始位置,一个用于结束位置,然后我想将它们传递到另一个函数中,该函数将计算它们之间的路由,因此关键问题是我需要可用的起始位置和结束位置变量,但它们在单独的事件中,因此我似乎可以得到一个,但不是另一个。你必须把它们都放在彼此里面。找到开始位置后,找到结束位置。找到终点位置后,您可以根据所有可用数据计算路线。尝试改变您的模式。同意,这是一个稍微棘手的问题,所以让我们考虑一些解决方案。我将在下面发表一些建议,同时,用你评论中的细节更新问题。@Juhana这是我最初的想法,但问题是他们仍然不能同时相互联系。是的,这是我考虑的方式,但我看到各种各样的问题都是这样做的,主要是速度问题,我仍然不确定是否能够同时从forwardGeocoder获得相邻的两个位置。@bagwaa,我没有看到任何问题,更不用说“各种”问题了。什么是速度问题?我所指的速度问题是“问题是速度太慢。你等待服务器的往返,然后才开始下一次往返”我想我现在已经根据这里的建议进行了排序,基本上,嵌套它们并检查事件完成情况,将发布我得到的结果。@bagwaa,尽管我建议不要嵌套这些调用,因为它们是独立的,但您可以随意做任何您想做的事情。您的解决方案将起作用,尽管它不需要完成计数。您可以删除该变量-嵌套将为您处理该变量,但代价是降低UX速度。