2015-04-02 2 views
3

Я использую $ .ajax для получения HTML-кода с сервера.Отключить отложенное внутри jQuery ajax

мой javascript использует обещания, и я хочу избежать создания другого обещания и использовать jQuery ajax, поскольку это уже обещание.

Но есть ли способ отклонить обещание внутри «сделанного» обратного вызова?

мой код выглядит примерно так:

function get_html(){ 

    return $.ajax({ .... }).done(function(response){ 

    if(response.haveErrors){ 
     // here how do I reject and return the promise? 
     return; 
    } 

    // code #2 should run normally 
    // but can i pass a "parameter" to done() ? 

    }).fail(function(){ 
     .... 
    }); 
} 

и использование:

get_html().done(function(parameter){ 
    // code #2 
}).fail(function(){ 

});

Кроме того, можно ли передать параметр в код №2? в сделанном обратном вызове?

+1

возможно дубликат [JQuery Отложено: Отклонение Promise изнутри Done Filter] (http://stackoverflow.com/questions/17800176/ jquery-offferred-rejecting-a-prom-from-in-done-filter) –

ответ

0

Похоже, ваш код должен быть, как показано ниже:

function get_html(){ 
    return $.ajax({ .... }); 
} 

get_html().done(function(response){ 
    // process a response from your server here... 
}).fail(function(){ 
    // process errors here... 
}); 
+0

Я не хочу обрабатывать ответ с моего сервера там. Функция get_html должна использоваться в нескольких местах. Я не хочу копировать код в любом месте :( – katie

4

Есть ли какой-то способ, которым я могу отклонить обещание внутри «сделано» обратного вызова?

Нет, потому что done не создает нового обещания и называется только тогда, когда обещание уже выполнено. Вы должны использовать then для цепочки - это создает новое обещание, которое можно отменить при обратном вызове. Однако, с jQuery this is a bit more complicated, мы не можем просто throw в обратном вызове.

Так используйте

function get_html() { 
    return $.ajax({…}).then(function(response) { 
     if (response.hasErrors) { 
      return $.Deferred().reject(response.errors); 
     } 
     // else 
     return response; // which is getting passed as the parameter below 
    }); 
} 

, а затем

get_html().then(function(parameter) { 
    // code #2 
}, function(err) { 
    // … 
}); 
Смежные вопросы