Trên thực tế, mã của bạn sẽ hoạt động khá nhiều, chỉ cần khai báo cuộc gọi lại của bạn như là một đối số và bạn có thể gọi nó trực tiếp bằng tên đối số.
Những thứ cơ bản
function doSomething(callback) {
// ...
// Call the callback
callback('stuff', 'goes', 'here');
}
function foo(a, b, c) {
// I'm the callback
alert(a + " " + b + " " + c);
}
doSomething(foo);
Điều đó sẽ gọi doSomething, sẽ gọi foo, sẽ cảnh báo "công cụ ở đây".
Lưu ý rằng việc truyền tham chiếu hàm ( foo) là rất quan trọng , thay vì gọi hàm và truyền kết quả của nó ( foo()). Trong câu hỏi của bạn, bạn làm điều đó đúng, nhưng nó chỉ đáng để chỉ ra vì đó là một lỗi phổ biến.
Những thứ cao cấp hơn
Đôi khi bạn muốn gọi lại để nó thấy một giá trị cụ thể cho this. Bạn có thể dễ dàng làm điều đó với callchức năng JavaScript :
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback) {
// Call our callback, but using our own instance as the context
callback.call(this);
}
function foo() {
alert(this.name);
}
var t = new Thing('Joe');
t.doSomething(foo); // Alerts "Joe" via `foo`
Bạn cũng có thể truyền đối số:
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback, salutation) {
// Call our callback, but using our own instance as the context
callback.call(this, salutation);
}
function foo(salutation) {
alert(salutation + " " + this.name);
}
var t = new Thing('Joe');
t.doSomething(foo, 'Hi'); // Alerts "Hi Joe" via `foo`
Đôi khi nó hữu ích để vượt qua các đối số bạn muốn đưa ra cuộc gọi lại dưới dạng một mảng, thay vì riêng lẻ. Bạn có thể sử dụng applyđể làm điều đó:
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback) {
// Call our callback, but using our own instance as the context
callback.apply(this, ['Hi', 3, 2, 1]);
}
function foo(salutation, three, two, one) {
alert(salutation + " " + this.name + " - " + three + " " + two + " " + one);
}
var t = new Thing('Joe');
t.doSomething(foo); // Alerts "Hi Joe - 3 2 1" via `foo`
object.LoadData(success)cuộc gọi phải sau khifunction successđược xác định. Nếu không, bạn sẽ gặp lỗi cho bạn biết chức năng không được xác định.