2014-01-02 5 views
1

У меня есть контроллер API, который возвращает HttpStatusCodeResult 200, если он работал, и 500, если они не смогли зарегистрироваться. Проблема в том, что .done и .fail будут вызваны независимо от того, какой код состояния будет возвращен. Однако информация размещена или опубликована неправильно. Вот моя функция сообщения. Любые идеи, что может быть причиной этого, будут очень признательны?Функция обратного вызова JQuery не работает и всегда вызывается

function register() { 
    $.post("../api/Register", 
       { 
        'Email': $("#rEmail").val(), 
        'Password': $("#rPassword").val() 
       }) 
    .done((function() { 
     alert("Thank you for registering!"); 
    })()) 
    .fail((function() { 
     alert("Email already exists"); 
    })()); 

} 

Edit: Проблема заключается в том, что она была перезагрузки страницы, когда jquery.unobtrusive должен не допустить этого. Исправление или обходной путь меняли его на кнопку, а не на форму.

ответ

4

Вместо передачи анонимных функций вы ссылающегося на него как IIFE, добавив () в конце функция

function register() { 
    $.post("../api/Register", { 
     'Email': $("#rEmail").val(), 
      'Password': $("#rPassword").val() 
    }).done(function() { 
     alert("Thank you for registering!"); 
    }).fail(function() { 
     alert("Email already exists"); 
    }); 

} 
+0

Спасибо, однако, когда я это делаю, fail вызывается каждый раз, даже когда должен быть вызван .done – Derked

+0

@Derked добавить обработчик сбоя как ' function (jqXhr, status, error) { alert (status + ' : '+ error +': '+ jqXhr.responseText) } 'и посмотреть, что предупреждено –

+0

Проблема в том, что она перезагружала страницу, когда jquery.unobtrusive должен предотвращать это. Исправление или обходное решение меняли его на кнопку, а не на форму в сочетании с вашими изменениями. – Derked

3

Проблема в том, что вы немедленно выполняете функции, которые передаются done и fail. Это приводит к тому, что эти функции выполняются именно тогда и там.

Так просто передать саму функцию, изменяя этот

.done((function() { 
    alert("Thank you for registering!"); 
})()) 

к этому

.done(function() { 
    alert("Thank you for registering!"); 
}) 
+0

Спасибо, однако, когда я делаю это, .fail вызывается каждый раз, даже когда .done следует называть – Derked

+0

@Derked - кажется, что ваш пост терпит неудачу каждый раз. Боюсь, я не могу сказать вам, почему это было бы без просмотра всего вашего кода/проверки вещей в сетевой консоли. –

+0

Я нашел причину проблемы, но я не уверен, как ее исправить. Проблема в том, что она перезагружает страницу, когда jquery.unobtrusive должен предотвращать это. Я считаю, что – Derked

0

Вы действительно не должны отправлять http-статус 500 по ожидаемому отказу регистрации, например условие «почта уже существует» ... это должно обрабатываться параметром, который обозначает успех/сбой как часть ответа 200.

Вы можете обрабатывать неожиданные внутренние ошибки сервера (состояние 500) с использованием успеха или ошибок обратных вызовов следующим образом:

$.ajax({ 
    url : "../api/Register", 
    type : "post", 
    data : {"Email" : "[email protected]", "Password" : "pw"}, 
    dataType : "json", 
    success : function(response){ 
     // handle http 200 responses 
     if(response.registrationApproved){ 
      alert("Thank you for registering!"); 
     }else{ 
      alert("email exists"); 
     } 
    }, 
    error : function(){ 
     // handle 500 or 404 responses 
     alert("server call failed"); 
    }, 
    complete : function(){ 
     // if needed.. this will be called on both success and error http responses 
    } 
}); 
Смежные вопросы