2014-01-14 97 views
-1

我想創建一個可重用的函數,我可以傳遞參數,並基於那個執行ajax調用。到目前爲止,這是我得到:阿賈克斯返回響應

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工作? - 當我調用函數時,我可以看到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) { 

}); 

或者使用回調:

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) { 

});