2013-07-29 2 views
0

У меня есть следующий код:понимания объекта возвращаемого асинхронного вызова

var bduplicate; 
bduplicate = false; 
bduplicate = check_for_duplicate_rule().done(function (result) { 
    console.log("result from check for duplicate" + result); 
    if(result == 'true') { 
     $('#validation_error').html("A similar rule already exists"); 
     return result; 
    } 
}); 

console.log(bduplicate); 

if(bduplicate.success == 'true') { 
    console.log('im exiting'); 
    return false; //exit this function 
} 

А вот определение самого метода асинхронного:

function check_for_duplicate_rule() { 
    var parameters = { 
     num: $('#num').val(), 
     condition: $('#condition').val(), 
     cdidnumber: $('#cdidnumber').val() 
    } 

    return $.getJSON(
     url = aURLdefinedsomewhere, 
     parameters, 
     function (data) { 
      //if (data=='true') {        
      //$('#validation_error').html("A similar rule already exists");  
      //} 
     } //end data 
    ); //end getJSON   
} 

Проблема:

Системы никогда входит в оператор IF, который выводит на консоль «im enter». Но он корректно меняет текст элемента validation_error. И он выводит на консоль следующее: результат проверки на наличие дубликата: true ". Это заставляет меня думать, что способ проверки результатов, хранящихся в bduplicate, неверен.

Что я пробовал так далеко:

Я включил следующую строку в коде:.

console.log (bduplicate);

, чтобы увидеть, что я получаю обратно консоль печатает Conte nts объекта и включает в себя множество различных свойств. Есть одно свойство «responseText», оно говорит responseText: «« true »↵« Может ли это быть проблемой? Хотя, если это так, это не объясняет, почему тест, чтобы установить элемент ошибки проверки, проходит.

В случае это помогает, сервер данных для Ajax вызова, как так:

return json.encode(true) 

Вопросы:

  1. В дополнение к попытке понять, почему я могу» t получить код для отображения результатов из команды console.log («im exiting»), мне также интересно, правильно ли я возвращаю данные json?
    я где-то читал, что технически это должно выглядеть следующим образом:

    возвращение json.encode («успеха: истинный») Если это так, то как бы я проверить на истину в передней части?

  2. Может ли кто-нибудь указать мне какую-либо документацию на объект, возвращаемый методом .done()? Я искал jQuery API, но ничего не нашел. Я, вероятно, не ищу правильные ключевые слова.

Спасибо.

+1

bduplicate - отложенный объект, значение успеха не назначается до тех пор, пока не будет разрешено обещание. Вам нужно будет проверить «bduplicate.success» в рамках функции «done». Дополнительная информация: http://api.jquery.com/deferred.done/ – rtimoshenko

+0

@ FabrícioMatté для первой части вопроса, я бы проголосовал, но не во второй части. –

+0

@MattLo Правильно, также 'json.encode' (в Q1) скорее всего ошибочен, но я не могу сказать, что OP не упоминает, какой язык сервера используется. –

ответ

1

jQuery AJAX методы, такие как $.getJSON, вернуть отложенный объект. Они позволяют подключать обратные вызовы, которые запускаются при вызове AJAX.

.done() прилагает обратный вызов. С AJAX он асинхронный. Это означает, что это происходит в фоновом режиме. Вы не можете вернуться от асинхронного метода. Ваш return result; ничего не делает.

Вам нужно сделать все действия, связанные с возвращаемые данные внутри обратного вызова.

Вот документы для отложенного объекта JQuery в: http://api.jquery.com/category/deferred-object/

+0

есть способ, которым я могу выйти из функции из обратного вызова? код, который вы видите, который содержит метод .done(), находится внутри .live («click», function() {}, и мне нужно сделать это, если метод ajax возвращает true, я просто хочу выйти из события .click обработчик –

+1

@markli: Нет, вы не можете этого сделать. Как работает AJAX, он работает в фоновом режиме. Запрос AJAX уволен, затем выполняется остальная часть обработчика кликов. Возможно, '.done' будет после того, как событие 'click' уже завершено. Итак, как я уже сказал, вам нужно сделать все * действия, которые используют результат * внутри * обратный вызов. –

+0

, так что, возможно, я не должен использовать ajax для проверки формы. потому что мне нужно знать, если что-то истинно/ложно, прежде чем перейти к следующему шагу/точке проверки. В приведенном выше примере, если вызов ajax возвращает true, то я не заполняю часть формы , тогда как если он ложный, я его заполняю. Спасибо btw за четкое объяснение. Я просто новичок, поэтому я ценю ваш четкий и описательный ответ RS. –

1

Ответ на вопрос 1: Звонок является асинхронным, что означает, что вы можете иметь дополнительные процессы до завершения запроса. console.log(bduplicate); немного ошибочно, потому что в Chrome он покажет вам обновленный объект, но на самом деле он не обновляется, пока вызов не будет завершен. Любой код вне обратного вызова будет выполнен. ПЕРЕД НАЧАЛОМ ваш звонок завершен. Вам нужно будет выяснить, как правильно передавать ваши данные в обработчике обратного вызова.

Ответ на вопрос 2:jQuery.ajax > jqXHR.done является частью обещаний/отложила парадигма (http://api.jquery.com/deferred.done/). Объект исходит из частного экземпляра jqXHR http://api.jquery.com/jQuery.ajax/#jqXHR.

+0

Мэтт, так вы говорите, что причина, по которой ошибка проверки правильна правильно, заключается в том, что по какой-то причине, хотя результат на самом деле не получен с сервера, результат оценивается как истинный, и поэтому изменение html для этот элемент? –

+1

@markli Прежде чем рассматривать, что происходит с пользовательским интерфейсом, вам нужно действительно понять природу асинхронности. Если вам нужен последовательный процесс (AJAX, то UI-манипуляция), просто вызовите метод манипулирования пользовательским интерфейсом в обратном вызове, а не вне метода 'done'. Theres уже сильно проверенный пост на HTTP ASYNC (в частности, jQuery) по адресу http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call (упоминается @ FabrícioMatté) –

+0

Благодаря Мэтту Ло! Этот последний комментарий был очень полезен! –

1

Чтобы ответить на ваш первый вопрос, установить Chromium, нажмите страницу, затем Ctrl-Shift-я, чтобы вызвать отладчик. Затем нажмите вкладку источников, найдите файл js и установите точку останова. Когда ваша точка останова попадет, проверьте свой объект. Chromium с радостью расширит ваши объекты.

+0

спасибо. я попытаюсь сделать это с этого момента! –

Смежные вопросы