2014-01-14 4 views
-1

Я пытаюсь создать функцию многократного использования, где я мог бы передать arg, и на основе этого выполнить вызов ajax. До сих пор это то, что я получил:Ajax return response

ajaxFunc: function(url, method, args) { 
    return { 
     var URL = url, 
      METHOD = method, 
      ARGS = args, 
      ERROR = error, 
      index = -1, 
      ajaxResponse, 
      AJAX = function() { 
       var url = URL + ((args == null) ? '' : ('/' + ARGS)), 
        data = (METHOD == 'post') ? ARGS[index] : undefined, 
        thisObject = this; 

       $.ajax({ 
        url:url, 
        method:METHOD, 
        data: data, 
        dataType: 'json', 
        error: function(jqXHR, textStatus, error) { 
         console.error(jqXHR, textStatus, error) 
        }, 
        success: function(response) { 
         ajaxResponse = response; 
        } 
       }); 

       return ajaxResponse; 
      }; 

     AJAX(); 
    }; 
}; 

Моя проблема в том, как я могу получить return работать? - когда я вызываю функцию, я вижу вызов get ajax, но функция никогда не возвращает ответ.

E.g: Если я делаю MAIN.util.ajaxFunc('http://url.com/', 'get', null);, я ничего не получаю взамен. Я хотел бы найти способ, которым я мог бы позвонить ajaxFunc, и после этого проверить ответ, если response.length что-то сделать.

Что я делаю неправильно?

+0

Ваш код завершается до того, как ajax получит ответ. – Marko

+1

Используйте обратный вызов, как это делает jQuery, и все события JavaScript. Нет никакого хорошего способа превратить что-то по сути асинхронное синхронное, и ваши пользователи будут благодарить вас за то, что вы этого не сделали. – Ryan

+0

'return {var URL = url' выглядит неправильно. –

ответ

0

С такими асинхронными операциями не возвращайте ответ. Вместо этого передайте данные другой функции, которая ему нужна. Любые функции, которые приковывают оттуда придется быть частью этой новой цепи, как это:

success: function(response) { 
    myFunction(response); 
} 

Вместо того чтобы использовать функцию обратного вызова, как это, вы могли бы использовать вместо этого обещания. Это делает то же самое, но избегает функции вложенности. Это выглядит следующим образом:

$.ajax({ 
    url: url, 
    method: METHOD, 
    data: data, 
    dataType: 'json', 
}).then(function (data) { 
    myFunction(data); 
}); 

Подробнее об обещаниях здесь: http://api.jquery.com/category/deferred-object/

1

Проблема заключается в том, что Ajax является асинхронной. Я хотел бы сделать что-то вроде этого:

Используйте отложила:

ajaxFunc: function (url, method, args) { 
    //... 

    return $.ajax({ 
     url: url, 
     method: METHOD, 
     data: data, 
     dataType: 'json', 
     error: function (jqXHR, textStatus, error) { 
      console.error(jqXHR, textStatus, error) 
     } 
    }); 
}; 

MAIN.util.ajaxFunc('http://url.com/', 'get', null).done(function(response) { 

}); 

Или использовать CALLBACK:

ajaxFunc: function (url, method, args, callback) { 
    //... 

    return $.ajax({ 
     url: url, 
     method: METHOD, 
     data: data, 
     dataType: 'json', 
     error: function (jqXHR, textStatus, error) { 
      console.error(jqXHR, textStatus, error) 
     }, 
     success: function (response) { 
      callback(response); 
     } 
    }); 
}; 

MAIN.util.ajaxFunc('http://url.com/', 'get', function(response) { 

});