【问题标题】:javascript ajax-call using callbacks vs passing in own functions使用回调的javascript ajax调用与传入自己的函数
【发布时间】:2013-12-29 09:35:25
【问题描述】:

我发现我可以传入可以使用 jquery 在 ajax 调用中调用的函数。但也有回调函数,它附加到 ajax 调用本身。现在我想知道,哪种方式是处理响应数据的更好方式:

我应该在(已经存在的)done-callback 中编写代码还是在自己编写的回调函数中编写代码,这将被传递给函数,或者两者兼而有之?

我对错误处理(失败,自己的失败回调)有同样的问题。 下面几行来更好地解释我在说什么(我希望它与我遇到的旧问题不太相似)。

function retrieveAndDisplayWords(x){....}; // if there are words added
function workOnDataDelete(y){...};         // have round about 5 different functionalities to define

 myRPCcall(method, url, data, workOnData, failedCall){
    $.ajax( {
        type: method,
        contentType: "application/json",
        data: data,
        url: url,
        dataType: "json"
        }).done(function(data, textStatus,jqXHR) {
           //work on data
            console.log("");
        }).fail(function(jqXHR, textStatus, errorThrown){
           //error-handling
            console.log("");
        });
  }


    // general ajax error handling function
    function failedCall( jqXHR, textStatus, errorThrown ){
        window.alert("AJAX call error occured");
        console.error( errorThrown );
    }

调用看起来像:

myRPCcall('GET', '/words/', null, retrieveAndDisplayWords, failedCall);

我向调用传递了两个函数,并附加了两个回调(完成,失败)。 据我了解回调“完成”和“失败”,这些应该包含响应数据发生的情况。由于我还为此目的传递了两个函数,我想知道这是否是多余的,或者这两个东西是否有不同的目的。

我认为以下是不可能的: }).done(函数(数据, textStatus,jqXHR) {

  //work on data
  workOnData(); // the function cannot be seen in the done-callback, can it?
   console.log("");
}).

因此,由于我需要以不同的方式处理响应的数据,因此我需要传递函数或在完成回调中有一个巨大的 if。我对吗?如果是 - 更好的方法是什么?

我会将它委托给成功处理程序吗? 我可以以某种方式将 jqXHR 传递给函数,还是它们可以访问?

{
type: method,
contentType: "application/json",
data: data,
url: url,
dataType: "json",
success: workOnData, //new 
error: failedCall    //new
}

所以基本上:何时以及如何使用传入的函数以及提供的回调呢?

希望我描述得足够清楚,如果需要改进帖子,请告诉我。 提前致谢。

【问题讨论】:

    标签: jquery ajax function callback


    【解决方案1】:

    成功:

    类型:函数(PlainObject data, String textStatus, jqXHR jqXHR) 请求成功时调用的函数。该函数获得三个参数: 从服务器返回的数据,根据 dataType 参数格式化;描述状态的字符串;和 jqXHR(在 jQuery 1.4.x 中,XMLHttpRequest)对象。从 jQuery 1.5 开始,success 设置可以接受一个函数数组。每个函数都会被依次调用。这是一个 Ajax 事件。

    错误:

    类型:函数(jqXHR jqXHR, String textStatus, String errorThrown) 请求失败时调用的函数。该函数接收三个参数:jqXHR(在 jQuery 1.4.x 中,XMLHttpRequest)对象、描述发生的错误类型的字符串和可选的异常对象(如果发生)。第二个参数的可能值(除了 null)是“timeout”、“error”、“abort”和“parsererror”。发生 HTTP 错误时,errorThrown 会接收 HTTP 状态的文本部分,例如“未找到”或“内部服务器错误”。从 jQuery 1.5 开始,错误设置可以接受一个函数数组。每个函数都会被依次调用。

    success: workOnData, //new 
    error: failedCall    //new
    

    有你的成功和错误方法如下。

    function workOnData(data, textStatus, jqXHR ){ ... }
    function failedCall(jqXHR, textStatus, errorThrown )){ ... }
    

    您可以在回调方法中通过将 jqXHR 作为参数来访问它。

    更多详情请参考文档:http://api.jquery.com/jquery.ajax/

    【讨论】:

    • 嗨!感谢您的回答-是的,这是文档...因此,我是否还使用直接附加到 $ajax 调用的“完成”和“失败”回调函数?如果我为函数做一个接口(“api”),“用户”而不是客户端的一部分是否应该编写函数 workOnData? (例如,一旦返回的数据以列表形式列在 scrren 上,而另一次在表中列出,则可能发生......)。
    • 当然你也可以使用 .done 和 .fail callbaks。 Note that success setting can accept an array of functions。您可以根据您的要求定义函数体。
    • 问题不是我是否可以,而是意味着除了成功和错误之外,使用这些是否有意义。如果我两者都用,那这不是双倍的吗?将函数作为参数提供的好处是,它可以是单独的,不是吗?
    • 嗯,如果你同时使用 success 和 .done() 是没有意义的。两者的意思是一样的。当你的 ajax 状态为成功时触发 .done() ,因此当你的 ajax 状态为错误时触发 .fail() 。
    • 感谢您的回答。所以,正如我所理解的,完全相同的事情。嗯,好的。所以我需要决定客户是否应该自己处理成功功能,或者我是否正在做某事。而更一般的(这里是关于 API)是,用户可以决定如何处理这些原始数据。感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多