Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将Ajax处理移动到函数?_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript 如何将Ajax处理移动到函数?

Javascript 如何将Ajax处理移动到函数?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有以下代码: function submitHandler($link, $modal, close) { var $form = $modal.find('#main-form'); var $submitBt = $modal.find('.block-footer button:contains("Submit")'); var oSubmit = { $form: $form, $modal: $modal,

我有以下代码:

  function submitHandler($link, $modal, close) {

    var $form = $modal.find('#main-form');
    var $submitBt = $modal.find('.block-footer button:contains("Submit")');
    var oSubmit = {
        $form: $form,
        $modal: $modal,
        action: $form.attr('data-action'),
        entity: $form.attr('data-entity'),
        href:   $form.attr('data-href'),
        row: $link.attr('data-row'),
        $row: $('#row_' + $link.attr('data-row')),
        $submitBt: $submitBt
    };

    if (!$form.valid || $form.valid()) {
        $submitBt.disableBt();
        $modal.removeBlockMessages()
            .blockMessage('Contacting Server, please wait ... ', { type: 'loading' });
        $.ajax({
            url: oSubmit.href,
            dataType: 'json',
            type: 'POST',
            data: $form.serializeArray()
        })
        .done(function (json, textStatus, XMLHttpRequest) {
            json = json || {};
            if (json.success) {
                submitSuccessModal(oSubmit, json);
                if (close == true) {
                    $modal.closeModal();
                    if (oSubmit.action == "Create") {
                        $('#createLink').prop('disabled', false);
                    }
                }
            } else {
                submitFailModal(oSubmit, json);
            }
        })
        .fail(function (XMLHttpRequest, textStatus, errorThrown) {
            setTimeout(function () {
                $modal
                    .removeBlockMessages()
                    .blockMessage('Could not contact server, please try again', { type: 'error' });
                $submitBt.enableBt();
            }, 1000);
            return false;
        });
    };
};

将该功能从my$.ajax中移出,并移入一个表示“完成”的函数和另一个表示“失败”的函数的最佳方法是什么。我还应该向这些函数传递哪些参数?我想我最困惑的是我应该如何处理我在代码顶部声明的变量。我是否应该像中那样将这些函数传递给外部函数。完成后,我确实引用了其中的一些函数。

您现在必须使用的是所谓的匿名函数。将对匿名函数(没有名称的函数)的引用传递到
done
fail
函数中

也许为了更好地组织代码(或使这些函数与其他代码共享),您只需给这些函数起一个名称,并将它们移到
ajax()
调用之外。我们将把它们称为
onDone
onFail
,当然你可以随便叫它们

请注意,我引用它们时不使用并列关系,因为我指的是函数对象本身,而不是被调用函数的返回值

  function onDone(json, textStatus, XMLHttpRequest) {
       json = json || {};
       if (json.success) {
           submitSuccessModal(oSubmit, json);
           if (close == true) {
               $modal.closeModal();
               if (oSubmit.action == "Create") {
                   $('#createLink').prop('disabled', false);
               }
           }
       } else {
           submitFailModal(oSubmit, json);
       }
   }

   function onFail(XMLHttpRequest, textStatus, errorThrown) {
       setTimeout(function () {
           $modal
               .removeBlockMessages()
               .blockMessage('Could not contact server, please try again', { type: 'error' });
           $submitBt.enableBt();
       }, 1000);
       return false;
   }

   $.ajax({
       url: oSubmit.href,
       dataType: 'json',
       type: 'POST',
       data: $form.serializeArray()
   })
   .done(onDone) //Reference to onDone, without parenthesis
   .fail(onFail);
由于
done()
fail()
已经将匿名函数作为参数,您只需在别处声明这些函数,然后按名称引用它们:

var doneFunction = function (json, textStatus, XMLHttpRequest) {
...
};

var failFunction = function (XMLHttpRequest, textStatus, errorThrown) {
...
};

$.ajax({
        url: oSubmit.href,
        dataType: 'json',
        type: 'POST',
        data: $form.serializeArray()
    })
    .done(doneFunction)
    .fail(failFunction);
这个怎么样:

var ajax_functions = {};
ajax_functions.success = function(json, textStatus, XMLHttpRequest) {
    // code
};

ajax_functions.error = function(XMLHttpRequest, textStatus, errorThrown) {
    // code
};

$.ajax({
    url: oSubmit.href,
    dataType: 'json',
    type: 'POST',
    data: $form.serializeArray(),
    success: ajax_functions.success,
    error: ajax_functions.error
});

谢谢我有个问题。参数是否通过just.done(onDone)传递?此外,我还更新了我的问题,以包括创建答案时的所有代码。我还有一些其他东西需要传递给.onDone,比如变量oSubmit。你认为我应该让这个全球化吗?我是否可以为对话框内容创建一个名称空间,并使其成为全局名称空间,还是应该以某种方式传递给onDone()?您正在调用
.done()
函数并传递对
onDone
函数对象的引用。无论最终调用这个函数的是什么,都将决定传入哪些参数。因此,传递给该函数的参数不是您在此控制的。我认为您为所需数据创建本地作用域的做法是正确的,这样您就可以在
onDone
函数中访问它。如果您想在
onDone
函数中访问
oSubmit
的值,只需将该函数放在相同的作用域中(在您的例子中,就是
submitHandler
函数)。即使在调用
onDone
时函数已经退出,该值仍将通过闭包的魔力得以保留。很抱歉问这个问题。但我能把函数放在函数中吗?如果是这样的话,那么你所说的范围听起来不错。谢谢,当然!做这样的事情也很常见:
var-onDone=function(json,textStatus,XMLHttpRequest){…}