Использование jQuery ajax-вызова для заполнения динамического объекта - PullRequest
2 голосов
/ 03 января 2012

У меня есть конструктор объекта:

function Context(tid) {
  this.tid = tid;
  var self = this;

 //We get all the data we need from the server to use in this Context.
 $.post(
   '/review/context/get_context',
   {tid: tid},
   function(data) {
     results = $.parseJSON(data);
     if(results.status == "SUCCESS") {
       self.obj = results.object;
       self.currenttodo = results.tid 
     }   
   }   
 );

}

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

$(document).ready(function() {
  cc = new Context($('#context-tabs').attr('name'));
  console.log(cc);
  console.log(cc.currenttodo);
}

генерирует следующий вывод консоли:

Context
currenttodo: 14
obj: Object
tid: "1"
__proto__: Context

undefined

Я думаю, что это стандартный случай, когда асинхронная функция не была завершена до выполнения следующей функции, но у меня есть несколько вопросов:

1) Почему я могу увидеть значение cc.currenttodo в console.log непосредственно перед console.log, где я не могу получить к нему доступ? 2) Почему вывод Chrome console.log отличается для двух целых чисел. 14 не в кавычках и синий, а tid: «1» красный и в кавычках. Я предполагаю, что это означает, что tid является строкой, но я хочу это подтвердить. 3) Как, если я не могу использовать асинхронные вызовы таким образом, я бы создал уникальный объект для использования в вызывающей функции $ document.ready (), заполненной из вызова сервера? Я бы подумал, что мне нужно будет сделать это через success: function, но, похоже, не могу получить ничего, кроме self.variables оттуда?

Заранее спасибо.

ОБНОВЛЕНИЕ: ТАК не позволяет мне отвечать на мои собственные вопросы, поэтому вот рабочий код:

function Context(tid) { 
  this.tid = tid;
  var self = this;

  //We get all the data we need from the server to use in this Context.
  $.ajax({
    url: "/review/context/get_context",
    type: "POST",
    data: "tid="+self.tid,
    async: false,
    dataType: "json",
    success: function(data) {
      if(data.status == "SUCCESS") {
        self.obj = data.object;
        self.currenttodo = data.tid; 
      }   
    }   
  }); 
}

Ответы [ 2 ]

1 голос
/ 03 января 2012

1) Предполагается, что вы нажимаете в консоли, чтобы осмотреть объект, потому что к тому времени, когда вы нажимаете, вызов завершается, и Chrome достаточно хорош, чтобы выяснить, что вы пытались увидеть. Однако консольные журналы происходят немедленно, поэтому немедленный запрос cc.currentodo означает, что он не знает в то время.

2) Правильно: «1» - это строка. Проверьте ответ JSON и посмотрите, что он отправляет для подтверждения.

3) Вы можете использовать функцию успеха или запустить POST синхронно. Я бы сказал, продолжать работать в первом. Как правило, получить управление асинхронной синхронизацией довольно сложно, но как только она заработает, она станет достаточно мощной.

0 голосов
/ 04 января 2012

Пример кода, который работает для создания экземпляра вышеуказанного объекта. Как уже указывалось, ключ async: false, в противном случае вы не можете передать результаты вызова AJAX экземпляру объекта внутри объекта

function Context(tid) { 
  this.tid = tid;
  var self = this;

  //We get all the data we need from the server to use in this Context.
  $.ajax({
    url: "/review/context/get_context",
    type: "POST",
    data: "tid="+self.tid,
    async: false,
    dataType: "json",
    success: function(data) {
      if(data.status == "SUCCESS") {
        self.obj = data.object;
        self.currenttodo = data.tid; 
      }   
    }   
  }); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...