Titanium和javascript匿名函数范围

时间:2011-10-26 09:54:32

标签: javascript javascript-events titanium

我试图在钛中调用forwardGeocoder函数,但我在检索结果时遇到一些问题,请考虑以下代码: -

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
                    });

                });
            }
        });

1 个答案:

答案 0 :(得分:1)

你可以像Juhana建议的那样嵌套电话。问题是这很慢。您等待从服务器往返,然后才开始下一次往返,并且只有在2次同步(即非并行)往返之后才执行所需的任务。如果数据彼此依赖,那将是必要的,尽管听起来它们不是

因此,您可以执行以下操作:

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
}

你看到它将如何异步工作吗?有一个小问题是您无法区分这些值,因为它们的顺序无法保证,但您可以轻松更改handle(例如currying,binding或wrap)来修复它。

你可以使用其他方法,虽然它们都是基于相同的想法 - 计算完成的任务,直到我保证完成所有任务,然后执行我们想要做的任务...