Coldfusion cfajaxproxy callbackhandler呼叫太多次了



我是使用Cfajaxproxy的新手,我试图选择许多复选框,然后循环浏览所有检查复选框,然后使用Cfajaxproxy和jquery和jQuery和jQuery。/p>

标记是通过查询循环产生的,但这里有一个带来问题的区域的样本:

<span id="1569_2627_text">I certify that the employee has been trained in the use of the following 
equipment (please check all that apply):</span><br />
<input type="hidden" name="2627_max_length" id="2627_max_length" value="">
<input type="hidden" name="2627_min_value" id="2627_min_value" value="">
<input type="hidden" name="2627_max_value" id="2627_max_value" value="">
<input type="hidden" name="2627_regex_format" id="2627_regex_format" value="">
<input type="hidden" name="2627_system_type" id="2627_system_type" value="">
<input type="hidden" name="2627_app_type_version" id="2627_app_type_version" value="1569">
<input type="hidden" name="2627_question_type" id="2627_question_type" value="CM">

<label>
    <input class="questionChoice" type="checkbox" name="2627" 
    value="8509" data-app_type_version="1569">
        <span>Face Shield<span>
</label><br />
<label>
    <input class="questionChoice" type="checkbox" name="2627" 
    value="8510" data-app_type_version="1569">
        <span>Neoprene Gloves<span>
</label><br />
<label>
    <input class="questionChoice" type="checkbox" name="2627"
    value="8511" data-app_type_version="1569">
        <span>Apron<span>
</label><br />
<label>
    <input class="questionChoice" type="checkbox" name="2627"
    value="8512" data-app_type_version="1569">
        <span>Boots<span>
</label><br />
<label>
    <input class="questionChoice" type="checkbox" name="2627"
    value="8513" data-app_type_version="1569">
        <span>Wizard Glove<span>
</label><br />
<label>
    <input class="questionChoice" type="checkbox" name="2627"
    value="8514" data-app_type_version="1569">
        <span>Insulated Mitt<span>
</label><br />
<label>
    <input class="questionChoice" type="checkbox" name="2627"
    value="8515" data-app_type_version="1569">
        <span>Insulated Glove<span>
</label><br />
<button class="add_answer" value="2627" data-app_type_version="1569" disabled>Add answer</button>

这是我的CFAJAX代理标签:

<cfajaxproxy cfc="#APPLICATION.cfMapping#.Agency.Agency" 
jsclassname="agency_object">

这是它应该在每个检查框上运行的功能:

function saveResponses(question_no, answerValue){
  var myagOBJ = new agency_object();
  myagOBJ.setHTTPMethod('POST');
  myagOBJ.setCallbackHandler(function(result) {
    numOfCalls++;
    alert(result+ ", call number: "+ numOfCalls);   
  });   
  myagOBJ.setErrorHandler(null);
  myagOBJ.store_prepopulated_response(
     agency_id = #SESSION.agency_object.get_id()#,
     jQuery("select##site").val(),
     question_no,
     answerValue
  );
}

这是通过每个检查框循环的jQuery代码:

$("div##" + div + " [name=" + question_no + "]:checked").each(function() {
    answerText = $(this).next().text();
    answerValue = $(this).val();
    identifier = question_no + "_" + answerValue;
    if(answers["q_" + identifier] ===  undefined) {
    formAppend();
    answers["q_" + identifier] = answerValue;
    alert("From Checkbox");
    saveResponses(question_no, answerValue);
    $("div##saved_answers table").append(
        "<tr id="" + identifier + ""><td><strong>" + formName + 
        "</strong><br>" + questionText + "</td><td>" + answerText + 
        "<br><button data-app_type_version="" + div + 
        ""class="remove" value="" + identifier + 
        "">Remove</button></td></tr>"
    );
    }
});

它调用的CFC的方法是:

<cffunction name="store_prepopulated_response" access="remote" returntype="string" verifyclient="true">
<cfargument name="agency_id" type="numeric" required="true">
<cfargument name="site_id" type="numeric" required="true">
<cfargument name="question_no" type="numeric" required="true">
<cfargument name="response" type="string" required="true">

<cfreturn "Agency id: #agency_id#, Site ID: #site_id#, Question No: #question_no#, Resonse: #response#">
</cffunction>

我仍然只是在测试事物以确保其起作用,因此除返回测试结果外,许多功能实际上都在做任何事情。

当我运行此代码时,它将调用CFC并返回结果,但是它调用了太多次。

例如,如果我选中三个框,它将调用CFC方法7次,如果我选中两个框,它将调用CFC方法5次。我选中所有7个框,CFC方法被称为19次。

我的第一个想法是,也许CFC称为正确的次数,但是CallbackHandler被调用了很多Agency_object并每次都调用该方法,但是我得到了相同的结果。

有人知道为什么会发生这种情况吗?

*(编辑)我刚刚在呼叫计数的实际CFC上添加了计数,实际上它调用了CFC方法太多次了。

"因为CallbackHandler不知道它应处理所有这些响应应处理所有响应"

这就是回调处理程序的工作方式。他们应该处理所有的回应。问题在于,您正在创建多个做同一件事的回调处理程序。每个响应都发送给每个处理程序。

通过使用JavaScript 匿名函数(将function(){...}作为方法参数传递)从saveResponses函数中设置处理程序,您正在附加该类的其他回调处理程序。如果您正在为每个请求创建和破坏对象,那可能是有道理的,但是正如帖子的评论中所讨论的那样,最好创建一个实例。使用这种方法,您也应该在此功能之外设置回调处理程序。

为了说明发生了什么,让我们看一下选中3个框并运行saveResponses时会发生什么:

saveResponses(...){
  //...
  myagOBJ.setCallbackHandler(function(result) {
    numOfCalls++;
    alert(result+ ", call number: "+ numOfCalls);   
  });
  //...
}

处理者的附加说明说明了3个复选框 -> 7个呼叫。

  • 您第一次打电话给它,您有1个处理程序和1个结果。
  • 第二次打电话给它,您添加了一个处理程序(2个处理程序),因此您的1个结果进行了两次。
  • 第三次打电话给它,您添加了第三个处理程序,因此1个结果处理了3次。

saveResponse由于.each()方法而被称为多次;它可以循环循环由jQuery选择器快速连续返回的每个项目,每个手柄函数一次。

只能加起来6个电话,因此仍然不正确,但是您可以看到这将如何迅速成为一个巨大的问题。第七可能是因为Ajax请求的异步性质。真正发生的事情可能更像是:

  • saveResponses
    1. 添加回调处理程序
    2. 发送ajax请求
  • saveResponses
    1. 添加回调处理程序
    2. 发送ajax请求
  • 第一个请求的结果又回来了。有2个处理程序,因此将其发送给两个。
  • 2到到目前为止看到的回调
  • 第二请求的结果又回来了。2个处理程序,发送给两个。
  • 4到达到目前为止看到的回调
  • saveResponses
    1. 添加回调处理程序
    2. 发送ajax请求
  • 第三请求的结果又回来了。3个处理程序,发送给所有3个。
  • 7到达到目前为止看到的回调

课程:在呼叫者之外声明/分配处理程序(在班级实例化的地方是最有意义的)。

如果您真的想了解JavaScript - 并且应该 - 选择 JavaScript的副本:好零件。它很短,但写得很好,使复杂的概念更容易理解。其中有些在您当前的技能水平上可能没有多大意义,而是关注一开始触及的内容(例如匿名功能),然后在您真正掌握这些功能之后,继续使用更艰难的模块。

最新更新