2012-10-15 14 views
7

Tôi có các chức năng sau được gọi mỗi 2 giây để tải một số dữ liệu. Nó đăng ký các funcion [do] để làm những thứ với phản ứng. (ví dụ được đơn giản hóa).Lắng nghe một chức năng được gọi là JavaScript

function doRequest(){ 
    $.ajax({ url: 'www.google.com.pe', success: function (response) {do(response)} }); 
} 

function do (text){ 
    var i = setInterval(doRequest, 2000); 
} 

Tôi tự hỏi nếu có bất kỳ cách nào để tôi có thể tạo hàm được gọi mỗi khi hàm [do] được gọi ra ngoài cần thêm cuộc gọi vào người nghe bên trong hàm làm. Cảm ơn trước. Nếu có cách nào tốt hơn để làm điều đó với jquery, giống như một plugin tôi đánh giá cao sự giúp đỡ.

[Chỉnh sửa] Ý tưởng không phải là liệu nó có hoạt động hay không. Câu hỏi của tôi là về nếu tôi có thể thêm một người nghe tùy chỉnh để "làm" chức năng mà đã được allready thực hiện. Một cái gì đó như addActionListener ("làm", "sau", doSomeThingElse) Vì vậy, tôi có thể làm một số điều khác chỉ sau khi chức năng làm đã hoàn thành.

+1

'2000' = 2 giây không 2 phút. Những gì bạn có trong setInterval là milli giây .. Đây chỉ là một chú thích –

+3

Không đặt tên cho hàm của bạn là 'do'. 'do' là một từ dành riêng trong Javascript. –

+1

Và nhân tiện, đối số của 'setInterval' cần được lật - hàm xuất hiện trước, sau đó là mili giây: https://developer.mozilla.org/en-US/docs/DOM/window.setInterval – Ian

Trả lời

5

Nếu bạn muốn giữ lại mã hiện tại như nó có, bạn có thể quấn do() trong một chức năng mà lần lượt gọi do() và chức năng mới của bạn (nói do_this_as_well()).

Xem ví dụ bên dưới (Tôi đổi tên do() thành do_this() để tránh nhầm lẫn xung quanh từ khóa được đặt trước do). Điều này làm việc bởi vì các hàm toàn cầu không là gì ngoài các biến với các đối tượng hàm trong chúng.Các biến này có thể được ghi đè, trong trường hợp này với hàm mới gọi là cũ:

function do_this(response) { ... } 

(function() 
{ 
    var previous=do_this; 
    do_this=function(response) { previous(response); do_this_as_well(); } 
})(); 
+0

Bạn đang ghi đè chức năng đầu tiên và gói cùng chức năng cũ vào một chức năng mới với Hành động tôi cần gọi; nó sẽ giữ tham chiếu từ cuộc gọi lại ajax? – jaxkodex

+0

Khó nói mà không biết bạn đang làm gì chính xác, bạn nói rằng ví dụ của bạn được đơn giản hóa. Nhưng nếu bạn chuyển một tham số phản hồi, tham số này sẽ được chuyển tiếp. –

+0

Tôi hiểu rằng nó sẽ ghi đè lên nó và ví dụ (vì nó ở đó) sẽ hoạt động khi gọi hàm ´do_this 'khi yêu cầu ajax thành công. Nó làm cho sence, đặc biệt kể từ khi bạn thêm lý do tại sao. tôi đã hiểu đúng không? – jaxkodex

1

Thay

với

success: function(response) { do(response); do_this_as_well(); } 
+0

Vì vậy, không có cách nào để thêm người nghe vào chức năng đã được tích hợp sẵn? – jaxkodex

+0

Tôi hiểu. Tôi cho rằng bạn có thể bọc() trong một hàm khác, nó sẽ hoạt động như một người nghe, nhưng JavaScript không cung cấp nguyên bản những gì bạn muốn. –

+0

Tôi đoán giải pháp, sau đó, sẽ sửa đổi gọi lại thành công từ yêu cầu ajax. Có cách nào để làm điều này trong thời gian chạy (Tôi không thể thay đổi mã) - Cảm ơn cho câu trả lời bằng cách này. – jaxkodex

6

Thứ nhất, phiên bản đơn giản của bạn sẽ không hoạt động, bởi vì bạn cần phải vượt qua do chức năng thay vì gọi nó.

function doRequest(){ 
    $.ajax({ url: 'www.google.com.pe', success: _do }); 
} 

Nhưng có vẻ như bạn đang hỏi làm thế nào để chạy một số mã khác mỗi khi do được gọi.

Nếu do chỉ được gọi bên trong hàm doRequest(), thì chỉ cần thêm mã khác của bạn vào một hàm ẩn danh gọi do vào đúng thời điểm.

function doRequest(){ 
    $.ajax({ url: 'www.google.com.pe', success: function(response) { 
      // Run your other code 
      // or invoke another function. 
      _do(response); 
    } }); 
} 

Nếu bạn muốn nó được tổng quát hơn, bạn có thể tạo một hàm trang trí mà trả về một chức năng mà gọi do sau khi một số mã khác.

function doFactory(fn) { 
    return function() { 
     fn.apply(this, arguments); 
     _do.apply(this, arguments); 
    } 
} 

sau đó thực hiện chức năng như thế này:

var doFoo = doFactory(function() { 
    console.log("foo"); 
}); 

Nếu yêu cầu của bạn là cụ thể hơn về một tiền xử lý của response, bạn có thể làm lại nó như thế này:

function doFactory(fn) { 
    return function(response) { 
     _do.call(this, fn.call(this, response)); 
    } 
} 

Sau đó, hãy sử dụng thao tác fn và trả lại response.

var doFoo = doFactory(function(response) { 
    return response + "foo"; 
}); 
+0

Loại cố gắng để làm việc với cùng một mã, do đó, câu hỏi của tôi là thêm về việc thêm một "eventListener" – jaxkodex

+0

@jaxkodex: Về chỉnh sửa của bạn, không có bạn không thể trực tiếp sửa đổi 'do' * (ít nhất là không có một số hack'.() 'và' eval' thủ thuật) * hoặc liên kết một số sự kiện với lời gọi của nó. Nhưng bạn * có thể * dễ dàng bọc 'do' trong một hàm khác mà thực hiện một số công việc khác. Có một số cách tiếp cận này. –