2009-11-21 32 views
5

Có cách nào để chạy một hàm sau khi các hàm khác hoàn tất không? Ví dụ:chức năng đồng bộ jquery

doSomething(); 
doSomethingElse(); 

tôi chỉ muốn doSomethingElse() chạy sau khi đã hoàn thành. điều này có thể không?

+2

Không gì bạn được đăng đã làm những gì bạn muốn? Tôi đang thiếu gì ở đây? –

+1

+1 để chống lại -1. Câu hỏi này có giá trị như bất kỳ câu hỏi nào khác. – echo

+1

Bất kỳ cơ hội nào bạn có thể cung cấp thêm mã cho chúng tôi hoặc cho chúng tôi biết bạn đang cố gắng làm gì? – Nosredna

Trả lời

7

Nếu chức năng doSomething() của bạn đang làm điều gì đó không đồng bộ (chẳng hạn như thực hiện yêu cầu Ajax) thì bạn sẽ muốn thực hiện yêu cầu không đồng bộ doSomethingElse() thay vì thực hiện ngay sau khi trả về doSomething().

+0

Tôi đang thực hiện một yêu cầu ajax vì vậy đây trông giống như giải pháp hợp lệ để đưa nó vào trong cuộc gọi lại, nhưng tôi chỉ đang cố gắng thực hiện nó bên ngoài cuộc gọi lại. – ngreenwood6

-1

Không có cách nào để thực thi này một cách rõ ràng cho mỗi gia nhập, nhưng một ý tưởng là phải có doSomething() trả về một giá trị mà doSomethingElse() chấp nhận như một tham số:

retval = doSomething(); 
    doSomethingElse(retval); 

như vậy ít nhất bạn ngăn chặn ai đó từ gọi doSomethingElse() mà không cần ít nhất là cung cấp đối số nó cần ... tất nhiên, cho dù họ nhận được đối số đó từ gọi doSomething() là một vấn đề khác. Nhưng đây là một sự khởi đầu.

Ý tưởng được nâng lên từ Hoàn thành mã.

+5

Tôi không thấy cách giải quyết bất cứ điều gì. Cách duy nhất câu hỏi có ý nghĩa là do doSomething() đang làm điều gì đó không đồng bộ. Các giá trị trả lại và truyền sẽ không có hiệu lực khi công việc được thực hiện. – Nosredna

6

Thực ra bạn có thể làm những gì bạn muốn với jQuery (ít nhất là theo một nghĩa nào đó). Nó có thể được coi là một chút hacky nhưng hoạt động hoàn hảo.

Chỉ cần bao gồm một phần tử trong trang của bạn mà bạn không sử dụng cho bất kỳ thứ gì khác. ví dụ. một div trống ở đâu đó.

<div id="syncFnHolder"></div> 

Và sau đó bao gồm JS với các chức năng của bạn + runMe do tôi viết.

function doSomething() { alert("First"); } 
function doSomethingElse() { alert("Second"); } 
function doSomethingElseThree() { alert("Third"); } 

function runMe(fn, selec) { 
    return function() { 
     fn(); 
     setTimeout(function() { 
      $(selec).dequeue("syncFnQueue"); 
     }, 1000); 
    } 
}; 

var selector = "#syncFnHolder"; 
//add three functions to a queue 
$(selector).queue("syncFnQueue", runMe(doSomething, selector)); 
$(selector).queue("syncFnQueue", runMe(doSomethingElse, selector)); 
$(selector).queue("syncFnQueue", runMe(doSomethingElseThree, selector)); 
//start first function in queue (FIFO) others are triggered automatically 
$(selector).dequeue("syncFnQueue"); 

Điều này sẽ tạo ra ba cảnh báo với khoảng cách 1 giây giữa chúng là "Thứ nhất", "Thứ hai", "Thứ ba".

Nếu bạn không muốn trì hoãn, hãy xóa setTimeout và chỉ để lại cuộc gọi tới $(selec).dequeue("syncFnQueue");.

Nếu chức năng của bạn cần thông số, ví dụ: doSomething(x,y,z) bạn cần phải điều chỉnh chức năng runMe để trở thành một phần tốt hơn và để xây dựng hàm trả về khác nhau. Kiểm tra tại đây hoặc đăng câu hỏi mới.

javascript partial

+1

rất thú vị – gpilotino

+2

Tại sao không chỉ làm xếp hàng và dequeuing của bạn trong một đối tượng JS. Dường như vô nghĩa để bật nó vào một phần tử DOM giả. – nickytonline

+0

? Làm thế nào tôi có thể làm điều đó với jQuery? Đoán tôi không thể làm theo những gì bạn có nghĩa là tại thời điểm này trong ngày (02:45 AM). – jitter

2

Câu hỏi này hơi mơ hồ.

Nếu chức năng của bạn có bit không đồng bộ với chúng, sau đó sử dụng gọi lại. Đó là những gì họ đang có.

Nếu, tuy nhiên, bạn muốn lập trình hướng-khía cạnh trong JavaScript, hãy xem jQuery-aop.

3

Bạn có thể muốn làm điều này ....

function doSomething(callback) { 
    // code for do some thing 
    // now fire off the callback 
    if (typeof callback === 'function') { 
     callback(); 
    } 
} 

function doSomethingElse() { 
} 

doSomething(doSomethingElse); 
Các vấn đề liên quan