Cách chuyển một lệnh gọi lại dưới dạng tham số vào một hàm khác


83

Tôi mới làm quen với các hàm ajax và callback, vui lòng bỏ qua cho tôi nếu tôi hiểu sai tất cả các khái niệm.

Vấn đề: Tôi có thể gửi một hàm gọi lại dưới dạng một tham số đến một hàm khác sẽ thực hiện lệnh gọi lại không?

function firstFunction(){
    //some code

    //a callback function is written for $.post() to execute
    secondFunction("var1","var2",callbackfunction);
}

function secondFunction(var1, var2, callbackfunction) {
    params={}
    if (event != null) params = event + '&' + $(form).serialize();

    // $.post() will execute the callback function
    $.post(form.action,params, callbackfunction);
}

Câu trả lời:


125

Đúng vậy. Tham chiếu hàm cũng giống như bất kỳ tham chiếu đối tượng nào khác, bạn có thể chuyển chúng vào nội dung trái tim của mình.

Đây là một ví dụ cụ thể hơn:

function foo() {
    console.log("Hello from foo!");
}

function caller(f) {
    // Call the given function
    f();
}

function indirectCaller(f) {
    // Call `caller`, who will in turn call `f`
    caller(f);
}

// Do it
indirectCaller(foo); // alerts "Hello from foo!"

Bạn cũng có thể chuyển các đối số cho foo:

function foo(a, b) {
    console.log(a + " + " + b + " = " + (a + b));
}

function caller(f, v1, v2) {
    // Call the given function
    f(v1, v2);
}

function indirectCaller(f, v1, v2) {
    // Call `caller`, who will in turn call `f`
    caller(f, v1, v2);
}

// Do it
indirectCaller(foo, 1, 2); // alerts "1 + 2 = 3"


13

Ngoài ra, có thể đơn giản như:

if( typeof foo == "function" )
    foo();


2

Tất nhiên là có, hàm là các đối tượng và có thể được truyền, nhưng tất nhiên bạn phải khai báo nó:

function firstFunction(){
    //some code
    var callbackfunction = function(data){
       //do something with the data returned from the ajax request
     }
    //a callback function is written for $.post() to execute
    secondFunction("var1","var2",callbackfunction);
}

một điều thú vị là hàm gọi lại của bạn cũng có quyền truy cập vào mọi biến mà bạn có thể đã khai báo bên trong firstFunction () (các biến trong javascript có phạm vi cục bộ).


0

Ví dụ cho CoffeeScript:

test = (str, callback) ->
  data = "Input values"
  $.ajax
    type: "post"
    url: "http://www.mydomain.com/ajaxscript"
    data: data
    success: callback

test (data, textStatus, xhr) ->
  alert data + "\t" + textStatus

những gì hiện ->có nghĩa là trong javascript @ gì-đặc biệt-đây?
shenkwen

->chỉ là một chức năng bình thường. var test = function(str, callback) { ajax call }
BarryMode

@shenkwen Một mũi tên mảnh -> là cú pháp CoffeeScript, không phải JavaScript, và chỉ đơn giản có nghĩa là một hàm JavaScript bình thường khi được biên dịch sang JavaScript. JavaScript có một hàm mũi tên tương tự w3schools.com/Js/js_arrow_osystem.asp
Bryan

0

Bạn có thể sử dụng JavaScript CallBak như thế này:

var a;

function function1(callback) {
 console.log("First comeplete");
 a = "Some value";
 callback();
}
function function2(){
 console.log("Second comeplete:", a);
}


function1(function2);

Hoặc Lời hứa Java Script:

let promise = new Promise(function(resolve, reject) { 
  // do function1 job
  let a = "Your assign value"
  resolve(a);
});

promise.then(             

function(a) {
 // do function2 job with function1 return value;
 console.log("Second comeplete:", a);
},
function(error) { 
 console.log("Error found");
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.