промежуточный javascript: функция-оболочка для запроса ajax выполняет основную функцию позже

#javascript #jquery

#javascript #jquery

Вопрос:

Хорошо, обычно у меня есть функция-оболочка запроса ajax, куда я передаю $data $sucessFunctionA и выполняю $.ajax запрос.

Но то, что я хочу сделать, это создать другую функцию: $successFunctionB которая принимает $sucessFunctionA в качестве параметра.

Итак, я передаю $data и $successFunctionB в $.ajax запрос.

Предположим, что это успешный результат. $successFunctionB выполняется. $successFunctionB проверяет результат данных на наличие значения. Если это определенное значение, то оно будет выполнено $successFunctionA . Что может меня смущать, так это то, что функция sucessFunction для запроса ajax может иметь только один параметр в качестве входных данных, который является результирующими данными.

Вот неработающий код того, что я пытаюсь сделать

 function ajaxCall($data,$successFunctionA) 
{

var $successFunctionB = function($data,$successFunctionA)
{
                data = jQuery.parseJSON($data);
                if(data.result=='good')
                {
                    $successFunctionA(data);
                }
}

$.ajax(
    {
        type:'POST',
        url:'server.php',
        datatype:'json',
        data:$data,
        success:$successFunctionB,
    });

}
  

Ответ №1:

Вам не нужно передавать $successFunctionA в $successFunctionB — функция B будет иметь доступ к функции A, потому что в javascript функции являются замыканиями. Итак, код выглядит следующим образом:

 function ajaxCall($data,$successFunctionA)
{
    var $successFunctionB = function($data)
    {
        data = jQuery.parseJSON($data);

        if(data.result=='good')
        {
            $successFunctionA(data);
        }
    };

    $.ajax(
    {
        type:'POST',
        url:'server.php',
        datatype:'json',
        data:$data,
        success:$successFunctionB,
    });
}
  

Это одна из самых важных концепций в js, поэтому, если вы не знакомы с замыканиями, я бы посоветовал ознакомиться с ними: http://blog.morrisjohns.com/javascript_closures_for_dummies

Ответ №2:

Если вы используете jQuery 1.6 или выше, $.proxy можете применить частичные параметры:

 $.ajax(
{
    type:'POST',
    url:'server.php',
    datatype:'json',
    data:$data,
    success:$.proxy($successFunctionB, this, $successFunctionA)
});
  

Первый параметр — это выполняемая функция, второй — контекст this указателя. Любые последующие параметры будут переданы $successFunctionB функции. Наконец, $.ajax вызов добавит свои собственные данные в качестве последнего параметра, поэтому вы должны изменить их порядок следующим образом:

 var $successFunctionB = function($successFunctionA, $data)