Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.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_Dom Events_Titanium - Fatal编程技术网

钛和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速度。