2013-02-18 2 views
2

Я готовлю материал для примера, в котором также рассматриваются основы обещаний jQuery, и я рассматриваю некоторые странные действия. Надеюсь, вы, ребята, можете помочь мне в этом.jQuery Посылы аргументов failback callback undefined

У меня есть следующий код, который отлично работает.

var getHTML1 = $.ajax({ 
     url: "jquerypromises.html",  
     type: "GET" 
}); 

getHTML1.done(function(responseText, state, jqXHR){ 
    console.log("success from AJAX request with promises : getHTML1!"); 
}); 

getHTML1.fail(function(){ 
    console.log("error from AJAX request with promises : getHTML1!"); 
}); 

//this one will call the failure callback!!!!!! 
var getHTML2 = 
$.ajax({ 
     url: "somenonexistingpage.html", //<== THIS WILL call the failure callback 
     type: "GET" 
}) 
.then(
    function(){ 
     console.log("success from AJAX request with promises : getHTML2!"); 
    } 
, 
    function(jqXHR, state){ 
     console.log("error from AJAX request with promises : getHTML2!"); 
    } 
); 

Этот код работает как espected для getHTML1 проделанная обработчик вызывается и для getHTML2 называется обработчик неудачи.

Теперь, когда я добавляю следующий код ниже кода, который вы видите выше.

$.when(getHTML1, getHTML2).then(
    function(response1, response2) { 
     // both arguments are arrays with[responseText, "success", jqXHR] 
     console.log("Both promises went successfull"); 
     console.dir(response1); 
     console.dir(response2); 
    }, 
    function(jqXHR, status) { 
     console.log("One of both promises went wrong!");   
     console.log(jqXHR); 
     console.log(status);   
    } 
); 

Снова вызывается надлежащий обработчик. В этом случае вызывается обратный вызов отказа, но все его аргументы не определены. Почему это?

Теперь, когда я удаляю обработчик отказа в then() блоке код getHTML2 становится так:

var getHTML2 = 
$.ajax({ 
     url: "somenonexistingpage.html", //<== THIS WILL call the failure callback 
     type: "GET" 
}) 
.then(
    function(){ 
     console.log("success from AJAX request with promises : getHTML2!"); 
    } 
); 

Теперь все работает, как и ожидалось, обработчик неудачи во втором, то() блок вызывается с аргументы заполнены.

Испытано в Chrome с JQuery 1.9.1

ответ

0

В основном, это потому, что документация then() говорит (курсив мой):

Эти функции фильтра могут вернуть новое значение, которое будет передано по до . Ответы на вызовы .done() или .fail(), или они могут вернуть другой объект наблюдения (Отложенный, обещающий и т. д.), который передаст статус разрешенного/отклоненного статуса и значения к обещанию обратные вызовы. Если используется используемая функция фильтра null или не указано, обещание будет устранено или отклонено. с теми же значениями, что и у оригинала.

Таким образом, вы можете вернуть одно значение из строя фильтра, который не то, что вы хотите (вы хотите два значения) или опустить фильтр из строя в целом, чтобы иметь then() проходят одни и то же значение, что и оригинальное обещание.

Если вы хотите реализовать сбой фильтра, который возвращает более одного значения, вы можете вернуть новый Отложенный объект, который вы сразу же отклонять с этими значениями:

var getHTML2 = $.ajax({ 
    url: "somenonexistingpage.html", //<== THIS WILL call the failure callback 
    type: "GET" 
}).then(function() { 
    console.log("success from AJAX request with promises : getHTML2!"); 
}, function(jqXHR, state) { 
    console.log("error from AJAX request with promises : getHTML2!"); 
    return $.Deferred().reject(jqXHR, state); 
}); 
+0

Perfect. благодаря –

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