2009-03-25 47 views
9

Về cơ bản, tôi muốn có thể bọc bất kỳ lệnh nào bằng phương thức $ .holdTillFinished() sẽ không cho phép thực hiện tiếp tục cho đến khi hoạt ảnh/jquery được chỉ định hoàn thành.Có thể dừng thực thi trong javascript/jquery không?

Tôi nghi ngờ rằng điều này có thể khó hoặc thậm chí không thể trong javascript, nhưng tôi hy vọng ai đó sẽ biết.

Tôi không muốn nghe về cách tôi có thể chuyển một cuộc gọi lại vào hoạt ảnh để nó hoạt động không đầy đủ hoặc bất kỳ thứ gì khác như thế.

Tôi thực sự muốn biết nếu một điều như vậy là có thể và làm thế nào để đi về nó.

Nếu điều đó không xảy ra nếu có ai biết về một plugin hàng đợi tốt có khả năng xếp hàng cả phương thức và hoạt ảnh do người dùng xác định, điều đó cũng sẽ rất tuyệt. Những gì tôi thực sự muốn là một cách để trì hoãn thực hiện mặc dù. (Trong khi vẫn cho phép hình ảnh động để hoạt động)

+0

@ khát: Bạn muốn hàng đợi và dequeue, tôi nghĩ (đã được bạn đề xuất và loại bỏ bên dưới). Bạn có thể xếp hàng các phương thức tùy ý cùng với các hình động và chúng sẽ thực hiện theo thứ tự. Nếu đây không phải là những gì bạn đang yêu cầu thì bạn có thể làm rõ câu hỏi của bạn với một ví dụ về những gì bạn đang cố gắng làm? – Prestaul

+0

Tôi chưa thấy hàng đợi hoạt động cho các chức năng. Ý của tôi là nếu tôi chuyển một hình động, sau đó là một hàm, sau đó là một hình động vào hàng đợi, trong khi đó các hoạt ảnh đang phát chức năng sẽ không được thực hiện. Ngoài ra tôi không muốn phải xác định bao lâu chức năng sẽ thực hiện. – thirsty93

+0

Nhưng thực sự những gì tôi muốn là một wrapper mà dừng tất cả javascript cho đến khi chức năng/hoạt hình tôi đã thông qua vào nó đã giải quyết – thirsty93

Trả lời

10

tôi nghi ngờ rằng điều này có thể khó khăn hoặc thậm chí không thể trong javascript

Nghi ngờ của bạn là chính xác. Các phương thức như hoạt ảnh, vòng đầu vào của người dùng và ‘async = true’ XMLHttpRequests phải kiểm soát trở lại trình duyệt để tiếp tục và trình duyệt không thể lấy lại quyền kiểm soát cho đến khi mọi mức gọi hàm hoạt động trở lại. Điều đó có nghĩa là tất cả mã của bạn, kể cả hàm có tên ‘holdTillFinished()’ sẽ phải giải phóng: do đó ‘holdTillFinished()’ là không thể.

Các ngôn ngữ khác có tính năng kiểm soát luồng cho phép bạn thực hiện có hiệu quả quy trình không đồng bộ dưới dạng xuất hiện cho người gọi đồng bộ và ngược lại. Nổi tiếng nhất là threadscontinuations. JavaScript không có các cơ sở này, vì vậy tốt nhất bạn có thể làm là hết thời gian chờ và gọi lại.

(Xác định gọi lại dưới dạng hàm nội tuyến để có quyền truy cập vào các biến của hàm kèm theo trong quá trình đóng, ít nhất phải mất một số cơn đau của nó; một số ngôn ngữ khác phải bắt đầu gói mỗi bit của trạng thái kèm theo trong đối tượng các thuộc tính để đạt được điều này.)

+0

Các ngôn ngữ khác được nói là gì? Tò mò ... –

+0

Khá nhiều ngôn ngữ hiện đại (không phải trình duyệt) cung cấp cho bạn các chủ đề, sử dụng hỗ trợ hệ điều hành. Tiếp tục/coroutines có thể được tìm thấy trong ít nhất Haskell, ML và Scheme và một số phần mở rộng cho các ngôn ngữ khác (ví dụ: Stackless Python); có các nguyên thủy trong C có thể được sử dụng để xây dựng các sự tiếp tục. – bobince

+0

Tất nhiên, trong thế giới trình duyệt, bạn đang mắc kẹt: ngoài JavaScript chỉ có VBScript, và thậm chí còn tồi tệ hơn! JavaScript 1.7 (trong Firefox 2) cung cấp cho bạn các trình tạo kiểu Python, đó là một dạng tiếp tục giới hạn mà sẽ không thực sự giúp bạn ở đây. – bobince

3

Bạn đang có lẽ tìm kiếm http://docs.jquery.com/Effects/queue

Nhưng nếu bạn đang tìm kiếm một cách tổng quát hơn của việc trì hoãn sự vật, tôi đã sử dụng đoạn mã này trước khi (tôi đã không viết nó, vì vậy tất cả các tín dụng đi vào tác giả ban đầu):

//Simple wrapper enabling setTimout within chained functions. 
$.fn.wait = function(time, type) { 
    time = time || 1000; 
    type = type || "fx"; 
    return this.queue(type, function() { 
    var self = this; 
    setTimeout(function() { 
     $(self).dequeue(); 
    }, time); 
    }); 
}; 
+0

Điều này không trì hoãn thực hiện cho đến khi chức năng kết thúc. Điều này có nghĩa là thực hiện chậm trễ trong hàng đợi bởi một số giới hạn thời gian mà tôi đang thiết lập. Tôi không biết phải mất bao lâu để chạy bất kỳ chức năng cụ thể nào và tôi không nên đoán. – thirsty93

+0

Điều này là tốt hơn sau đó không có gì mặc dù. Nhưng nó thực sự không phải những gì tôi đang tìm kiếm. – thirsty93

0

Bạn có thể sử dụng kiến ​​trúc xuất bản/đăng ký để đạt được những gì bạn muốn. Nếu không biết nhiều về chính xác những gì bạn muốn đạt được, tôi đoán là điều này sẽ làm việc cho bạn.

Cách hoạt động này là bạn xem xét việc hoàn thành chức năng dưới dạng sự kiện, bạn có thể nghe và đính kèm trình xử lý. Dojo has a pubsub mechanism, mặc dù tôi chắc chắn có những người khác.

+0

Đây chính xác là những gì tôi không muốn. Một cuộc gọi lại mà tôi chuyển đến chức năng/hoạt ảnh được đề cập – thirsty93

0

Nó bảo vệ theo tình hình nhưng thông thường nó là cần thiết để hiển thị một hình ảnh xử lý được hiển thị khi AJAX được gọi hoặc bất kỳ vòng lặp đang thực hiện trong javascript. Tôi có một tình huống mà tôi đang gọi AJAX trong một vòng lặp, để người dùng hiển thị hình ảnh xử lý được hiển thị. Để chấm dứt tôi đã thực hiện một thủ thuật. Tôi đã đặt một nút để hủy bỏ công việc khi chức năng này được gọi là tôi đặt một biến toàn cầu nói 'cancelJob' thành true và trong vòng lặp mà tôi đang kiểm tra toàn cầu này nếu điều này đúng true return false và script sẽ dừng lại.

var cancelJob = false; 
foreach(){ 
    if(cancelJob == true) 
     return false; 
} 

function cancelButtonPress(){ 
    cancelJob = true; 
} 
Các vấn đề liên quan