【问题标题】:Asynchronous return of function in jqgridjqgrid中函数的异步返回
【发布时间】:2013-01-08 09:57:20
【问题描述】:

首先对不起我的英语,

我正在使用 jqgrid。我有一张管理客户的桌子。当我想添加一个新客户端时,我在 beforeSubmit 事件中进行了 ajax 验证,以检查客户端是否存在于外部系统上。该函数的第一个参数是一个布尔值(如果为真,则继续执行添加客户端,如果为假则停止)

beforeSubmit: function(postdata, formid) {

      var form = formid[0];
      var hostId = $.trim(form.HOSTID.value);
      var document = $.trim(form.DOCUMENT.value);
      var idMurex = $.trim(form.IDMUREX.value);

      var success;

      processClientData(hostId, document, idMurex).done(function() {

           alert('OK');
           success = true;

      }).fail(function() {

           alert('KO');
           success = false;

      });

      return[success, '']; 

},

ajax 函数返回客户端是否存在。如果客户端存在,它会显示是否继续的确认对话框,具体取决于用户是否同意客户端信息。如果客户端不存在,它会显示一个显示错误消息的警报对话框。

function processClientData(hostId, document, idMurex) {

        var def = $.Deferred();

        //SERVER RESPONSE IF EXISTS CLIENT
        $.post('/watt/cambio_titularidad', {    
                oper: 'datos_cliente', 
                hostId: hostId,
                document: document,
                idMurex: idMurex
            },
            function(response){

                //CLIENT EXISTS (SHOW CONFIRMATION DIALOG WITH CLIENT INFO)
                if (response.success == true) {
                    $("#dialog_info_tablas").dialog({ 
                        title: "CLIENT EXISTS",
                        modal: true,
                        buttons: {
                        "Ok": function()  {
                            $(this).dialog("close");
                            def.resolve();
                        }
                        "Cancel": function()  {
                            $(this).dialog("close");
                            def.reject();
                        }
                    }
                });

                //CLIENT DOESN´T EXIST (SHOW ALERT DIALOG WITH ERROR MESSAGE)
                } else {
                    $("#dialog_info_tablas").dialog({ 
                        title: "CLIENT NOT EXISTS",
                        modal: true,
                        buttons: {
                            "Ok": function()  {
                                $(this).dialog("close");
                                def.reject();
                            }
                        }
                    });
                }        
            }, 
            "json")

            return def.promise();
        } 

我使用 Deferred 对象来尝试同步 ajax 调用。

问题是在 var success 具有正确值之前执行 return 语句。我不知道如何使它同步,我需要延迟返回,直到用户单击对话框按钮,从而继续添加客户端与否。我试图将返回语句放在 donefail 函数中,但它也不起作用

谁能帮帮我??

提前致谢

【问题讨论】:

    标签: jquery ajax asynchronous jqgrid jquery-deferred


    【解决方案1】:

    我建议您在表单提交中使用错误处理,而不是在beforeSubmit 中实现额外的服务器端验证。回调beforeSubmit 应该更好地用于客户端验证。

    如果在编辑期间向服务器提交任何数据,Ajax 请求将被发送到服务器。服务器可以验证输入数据并返回错误消息。在这种情况下,将任何 HTTP 错误代码放在服务器响应中很重要。您可以使用表单编辑的errorTextFormat回调,根据服务器返回的错误响应自定义显示给用户的错误信息。

    【讨论】:

    • 感谢 Oleg,问题是我需要用户的 OK 才能获得返回 ajax 调用的客户端信息。虽然客户端没有单击“确定”或“取消”对话框的按钮,但我无法返回 true 或 false 以继续添加操作。
    • @AlexCuervo:对不起,但我还是不明白为什么用户每次点击“提交”按钮之前都需要点击附加对话框的“确定”。如果您需要一些额外的验证,您可以使用例如setTimeout,就像 jQuery UI Autocomplete 一样。或者,您可以在输入字段的一侧添加其他按钮,例如带有 showOn: "button" 的 jQuery UI Datepicker。验证方式将在用户键入的同一个对话框中进行。以任何方式实现errorTextFormat 回调我认为每个生产解决方案都需要。
    • @AlexCuervo:请参阅 the answer 以了解使用 Datepicker 和按钮的示例。就像 jQuery UI 可以在主 <input> 元素附近创建按钮一样,您可以在 beforeShowFormdataInit 内部执行相同操作。
    • 我需要显示一个确认对话框,因为在继续添加之前用户必须接受或拒绝客户端信息(用户输入客户端的 id 和 ajax 调用从外部系统返回所有数据客户端)
    • @AlexCuervo:我试图理解为什么你需要这个,而不仅仅是你需要的什么。 stackoverflow 的目标是分享common 问题并分享相应的解决方案。无论如何,我仍然不明白你的问题。如果您真的需要显示确认对话框:只需执行此操作。您可以阻止网格或整个页面,直到服务器响应。见jQuery BlockUI Plugin
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2021-02-23
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多