jQuery - отложенная функция ajax, возвращаемая только в случае успеха? - PullRequest
1 голос
/ 13 июля 2011

У меня настроен некоторый код, и я хотел бы получить очень простой API для запросов ajax.

Итак, я хотел бы просто использовать deferred, чтобы вернуть успех.

var factory = function(dataParams) {
    return $.ajax({
        type       : "POST",
        dataType   : "json",
        url        : "http://example.com/whatever",
        data       : dataParams,
        beforeSend : function(jqXHR, settings){/*... something here ...*/},
        error      : function(jqXHR, textStatus, errorThrown){/*... something here ...*/},
        complete   : function(jqXHR, textStatus) {/*... something here ...*/}
});

Что будет вызвано чем-то вроде

var dataTools = {
    "foo" : function(){
        factory({"One": 1}).success(function(jqXHR){
            //Do something to jqXHR
            //Return something to the "upper most" calling... how?
        })
    }
    "bar" : function(){
        factory({"Two": 2}).success(function(jqXHR){
            //Return jqXHR to the "upper most" calling... how?
        })
    }
};

Так, чтобы я мог использовать его таким образом:

$.each(dataTools.foo(), function(k,v){
    console.log(v);
});

По существу, объект dataTools.foo возвращает значение из успеха или должен возвращать пустой набор в области сбоя или что-то, что пропускает эту ветвь кода.

Я пытался использовать $.when().then(), но я не могу понять, как вписать это в то, что я описал здесь.

1 Ответ

1 голос
/ 13 июля 2011

Ajax является асинхронным.

Вы не можете использовать $.each в асинхронной функции.

У вас не может быть функции, вызывающей функцию, вызывающую ajax, тогда можно ожидать использования $.when и связанных функций.

Вам нужно сделать что-то, как сказано в Документ


Попробуйте что-то вроде этого:

var dataTools = {
    "foo" : function(){
        $.when(factory({"One": 1})).done(function(a1, a2){
            var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */
        });
    }
    "bar" : function(){
        $.when(factory({"Two": 2})).done(function(a1, a2){
            var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */
        });
    }
};
...