Javascript: установить порядок функций - PullRequest
1 голос
/ 26 августа 2011

Я пишу приложение из титана, но у меня проблема с порядком выполнения моего JavaScript.

У меня есть прослушиватель событий на кнопке.Это кнопка перезагрузки, которая очищает таблицу, использует HTTPClient для получения JSON-массива «встреч», сохраняет каждую встречу и обновляет список таблиц.Проблема в том, что я сначала выполняю удаление таблицы, которая должна очистить таблицу, затем я получаю встречи, но когда приложение обновляет данные, это как будто оно делает это слишком рано, и новые встречи еще не были сохранены, потому что я получаюпустой список.Теперь, если я закомментирую строку db.deleteAll, каждый раз, когда я нажимаю перезагрузить, список обновляется новыми (и существующими) данными о встречах.

Мне нужно убедиться, что все сделано по порядку и только когдапредыдущее задание выполненоТак что assignments.download () должен выполняться ПОСЛЕ db.DeleteAll, и обновление списка должно выполняться ПОСЛЕ var allAppointments = db.All ();

Я думаю, что проблема заключается в том, что assignments.download ()функция должна выполнить HTTP-вызов GET, а затем сохранить результаты, а другие функции не ждут, пока она не будет завершена.

Вот код:

btnReload.addEventListener('click', function(e){
    var affected = db.deleteAll();
    appointments.download();
    var allAppointments = db.all();
    Ti.API.info(allAppointments);
    appointmentList.setData(allAppointments);
});

Вот вызываемые функции:

db.deleteAll ():

api.deleteAll = function(){
    conn.execute('DELETE FROM appointments');
    return conn.rowsAffected;
}

assignments.download ():

var appointments = (function() {
    var api = {};
    api.download = function(){

        var xhr = Titanium.Network.createHTTPClient();
        xhr.onload = function()
        {
          var data = JSON.parse(this.responseText);
          var dl = (data.length);
          for(i=0; i<dl;i++)
          {
            //p = addRow(data,i); // returns the **arr array 
            //Ti.API.info('Saving : '+data[i].first_name);
            var contact_name = data[i].first_name + ' ' + data[i].last_name;
            var start_date = data[i].start_date;
            var reference = data[i].reference;
            var comment = data[i].comment;
            var appointment_id = data[i].quote_id;

            var lastid = db.create(appointment_id, start_date, reference, contact_name, comment);
            //Ti.API.info(lastid);
          }

        };
        xhr.open('GET','http://********.co.uk/appointments/download/');
        xhr.send();

        return;
}

Любая помощь наиболее ценится!Билли

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Синхронные вызовы дают вам координацию (код не будет выполняться, пока не завершатся какие-либо вычисления, от которых он зависит) бесплатно. При асинхронных вызовах вы должны позаботиться о координации. Обычно это означает передачу зависимого кода как функции в асинхронный код. Переданный код известен как « продолжение », что означает «остаток вычисления от заданной точки вперед». Передача продолжения известна как (неудивительно) " стиль передачи продолжения ".

Чтобы переписать код в CPS, укажите точки, в которых вам нужно координировать код (вызов appointments.download), а затем оберните остальную часть кода в функцию.

btnReload.addEventListener('click', function(e){
    var affected = db.deleteAll();
    appointments.download();
    function () {
        var allAppointments = db.all();
        Ti.API.info(allAppointments);
        appointmentList.setData(allAppointments);
    }
});

В общем случае возвращаемое значение становится аргументом продолжения. Здесь возвращаемое значение для appointments.download не используется, поэтому продолжение не имеет аргументов.

Затем переписать асинхронную функцию, чтобы взять продолжение и передать продолжение в вызове.

btnReload.addEventListener('click', function(e){
    var affected = db.deleteAll();
    appointments.download(
        function () {
            var allAppointments = db.all();
            Ti.API.info(allAppointments);
            appointmentList.setData(allAppointments);
        });
});

...
api.download = function(_return){
    var xhr = Titanium.Network.createHTTPClient();
    xhr.onload = function() {
        var data = JSON.parse(this.responseText);
        var dl = (data.length);
        for (i=0; i<dl;i++) {
            //p = addRow(data,i); // returns the **arr array 
            //Ti.API.info('Saving : '+data[i].first_name);
            var contact_name = data[i].first_name + ' ' + data[i].last_name;
            var start_date = data[i].start_date;
            var reference = data[i].reference;
            var comment = data[i].comment;
            var appointment_id = data[i].quote_id;

            var lastid = db.create(appointment_id, start_date, reference, contact_name, comment);
            //Ti.API.info(lastid);
        }
        _return();
    };
    xhr.open('GET','http://********.co.uk/appointments/download/');
    xhr.send();

    return;
}

Продолжение называется _return, поскольку оператор return можно смоделировать как продолжение (продолжение по умолчанию). Вызов _return в асинхронной версии будет иметь тот же эффект, что и вызов return в синхронной версии.

0 голосов
/ 26 августа 2011

Переместить вызов, чтобы удалить текущие встречи в обработчике загрузки.Таким образом, вы удалите старые и сразу добавите новые данные.

0 голосов
/ 26 августа 2011

В настоящее время вы делаете запросы асинхронно, что означает, что вы делаете запрос и немедленно возвращаетесь из функции, вы не ждете ответа.Вы должны делать ваши звонки синхронными, я не знаю, каковы ваши conn и xhr на самом деле, но они могут предоставить способы сделать методы execute() и send() синхронными.Например, если для третьего аргумента собственного * JavaScript-метода XMLHttpRequest в JavaScript установлено значение false, метод send() не вернется до тех пор, пока не будет получен ответ от сервера, у ваших классов соединений может быть та же опция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...