Область действия анонимных функций Titanium и Javascript - PullRequest
0 голосов
/ 26 октября 2011

Я пытаюсь вызвать функцию 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 Ответ

1 голос
/ 26 октября 2011

Вы можете сделать так, как Юхана предложила вкладывать звонки. Проблема в том, что это медленно. Вы ожидаете двусторонней передачи с сервера и только затем начинаете следующую обратную передачу, и только после 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 (например, каррирование, связывание или перенос), чтобы исправить это.

Вы можете использовать другие подходы, хотя все они основаны на одной и той же идее - считать выполненные задачи до тех пор, пока я не гарантирую, что все выполнено, а затем выполнить задачу, которую мы хотели выполнить ...

...