Возвращаемое значение из обратного вызова Ajax? - PullRequest
1 голос
/ 18 августа 2011

У меня есть класс JavaScript, который обрабатывает запросы к локальной БД (на устройстве WebOs).Теперь я хочу создать модель со всеми моими основными запросами, чтобы упростить мой код.

Итак, сначала я создаю функцию:

getLists: function(){
          this.query( 'SELECT * FROM lists ORDER BY rowID DESC', { 
                onSuccess:  enyo.bind(this,function(data) { this.getData(data); } ), 
                onError: function() { return false; } } );
   }

И затем у меня есть функция обратного вызовакоторый получает данные:

getData: function(data){
       return data;
   }

Теперь то, что я хотел бы сделать, это вызвать это из моего приложения:

var data = getLists();

Проблема в том, что это не возвращает данныеиз моей функции обратного вызова (getData).У меня вопрос: как мне получить, чтобы getLists возвращал данные из обратного вызова?

Спасибо

Ответы [ 2 ]

2 голосов
/ 18 августа 2011

Вы думаете, что имперский: C следует за B, следует за A. Забудьте об этом.

AJAX и современный JavaScript работают по-другому.Вы никогда не говорите «получить данные сейчас», вы говорите «вызывайте X, когда данные доступны».

Таким образом, решение состоит в том, чтобы написать некоторый код, который делает что-то полезное с данными.Давайте назовем эту функцию a.Вместо:

var data = conn.getData();
a( data );
b( data );
c( data );

вы делаете

conn.getData( a ); // a has to call b which calls c.

В конечном итоге данные будут там, и a будет вызываться с data в качестве аргумента.

Увидеть?Вы не связываете вызовы a() и b(), как в традиционном программировании.Вместо этого вы создаете функции, которые делают то, что вы хотите, и передаете эти функции.

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

Ты не доберешься до. Первый A в AJAX является асинхронным. Запросы происходят "вне времени" с другой обработкой. Ваш вызов getLists возвращается после запуска запроса AJAX, и функция обратного вызова вызывается, когда удаленный сервер отвечает на запрос AJAX.

- отредактировано для комментариев -

Если вы хотите «посмотреть» переменную, вы можете использовать что-то вроде этого:

// Set up a container for the data to return to.
var retData;

// Modify the getData function to assign to the global variable
getData: function (data) {
  retData = data;
}

// Start the "wait" process.
var myInterval = setInterval(function () {
  if (retData == undefined) {
    return;
  }

  // when the return data shows up stop waiting.
  clearInterval(myInterval);

  // some other data processing here in this function
  // or trigger the actual processing function.
  // don't have to pass retData to it, it's global, the 
  // data handler function can retrieve it itself.
  myDataHandler();
}, 1000);

// make the ajax call here.
getLists();
...