Как написать функцию jQuery с обратным вызовом, которой можно передавать параметры?

#javascript #jquery

#javascript #jquery

Вопрос:

У меня есть следующая функция:

 function loadProjects(pID) {

    $.ajax({
        url: myURL,
        success: function (dataJS) {###Run any supplied call back here####}
    });
}
  

Я вызываю эту функцию следующим образом loadProjects(1);

Проблема в том, что я хочу иметь возможность определять функцию обратного вызова после успешного выполнения, и я хотел бы включить ее при выполнении loadProjects (1, pong (12)). Я хочу иметь возможность предоставлять параметры для обратного вызова.

Как я могу заставить функцию принимать обратный вызов? Как я могу передать обратный вызов этой функции?

Что-то вроде

 function loadProjects(pID, callback) {

    $.ajax({
        url: myURL,
        success: function (dataJS) {###Run any supplied call back here####}
    });
}
  

Где я мог бы затем вызвать:

 loadProjects(22, pong(12))
  

Проблема в том, что когда я пытаюсь это сделать, pong (12) запускается немедленно, а не позже при вызове в функции loadProjects?

Идеи? Спасибо

Ответ №1:

попробуйте это:

 function loadProjects(pID, callback) {

    $.ajax({
        url: myURL,
        success: function (dataJS) {
           if ($.isFunction(callback))
              callback();
        }
    });

}

loadProjects(1, function() { pong(12); });
  

или:

 function loadProjects(pID, callback, value) {

    $.ajax({
        url: myURL,
        success: function (dataJS) {
           if ($.isFunction(callback)) {
              if (value) {
                 callback(value);
              }else{
                 callback();
              }
           }

        }
    });

}

loadProjects(1, pong, 12);
  

Комментарии:

1. Это потрясающе. Спасибо. Я соглашусь один раз, ТАК что позвольте мне. еще 5 минут, гррр

2. 1 для $.isFunction , что красивее, чем typeof foo == 'function'

3. @karim79 Который также завершается сбоем в WebKit… typeof /regex/ === 'function' 😛 (если не используется jQuery, я использую callback instanceof Function ).

4. @ColdTree посмотрите на эту ссылку, если вам нужно сделать что-то более сложное: developer.mozilla.org/en/JavaScript/Reference/Global_Objects /…

5. @alex — 1 что касается webkit, я не знал об этом.

Ответ №2:

 loadProjects(22, function(){pong(12);});
  

Ответ №3:

Попробуйте что-то вроде этого:

 var loadProjects = (function(pID, callback) {
    var params = { "property" : "value" }
    $.ajax({
       url: myURL,
       success: function (dataJS) { callback(params); }
    });
})

loadProjects(22, function(p){ console.log(p); });
  

Ответ №4:

 function loadProjects(pID, callback) {
    var callbackArgs = arguments;
    callbackArgs.shift();
    callbackArgs.shift();

    $.ajax({
        url: myURL,
        success: function (dataJS) {
            // Null or this can be used depending on desired behavaiour
            // See https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply
            callback.apply(null, callbackArgs);
        }
   });
}
  

Пример использования:

 loadProjects(22, pong, 12);
loadProjects(22, pong, 12, 'foo', 'bar');
  

12, foo и bar передаются в обратный вызов pong.