2013-05-13 64 views
17

Tôi đang cố gắng nắm bắt các hàm không đồng bộ Javascript và gọi lại.Javascript có đồng bộ (chặn) hoặc Không đồng bộ (không chặn) theo mặc định

Tôi bị kẹt trên khái niệm hàm gọi lại, nơi tôi đọc ở một số nơi: chúng được sử dụng để thực thi tuần tự mã (chủ yếu trong ngữ cảnh của jquery ví dụ như animate) và một số địa điểm đặc biệt trong ngữ cảnh của Nodej; chúng được sử dụng để thực thi song song Không đồng bộ và tránh việc chặn mã.

Vì vậy, có thể một số chuyên gia trong chủ đề này xin vui lòng làm sáng tỏ điều này và xóa mờ này trong tâm trí của tôi (ví dụ ??). để tôi có thể quyết định sử dụng chức năng gọi lại

hoặc chỉ phụ thuộc vào nơi bạn đang gọi/đặt chức năng gọi lại trong mã của bạn? .

Cảm ơn,

PS: Tôi sợ rằng câu hỏi này sẽ là gần như chủ quan nhưng tôi vẫn có thể mong đợi câu trả lời cụ thể cho điều này (có lẽ một số ví dụ)

Edit: thực sự đây là ví dụ từ internet mà làm cho tôi ambigous:

function do_a(){ 
    // simulate a time consuming function 
    setTimeout(function(){ 
    console.log('`do_a`: this takes longer than `do_b`'); 
    }, 1000); 
} 

function do_b(){ 
    console.log('`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a`'); 
} 

do_a(); 
do_b(); 

quả

`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a` 
`do_a`: this takes longer than `do_b` 

khi JS là tuần tự thì do_b phải luôn theo sau do_a theo sự hiểu biết của tôi.

+6

JavaScript JavaScript; nó phụ thuộc vào ngữ cảnh, cách sử dụng, công cụ, v.v. –

+0

Bạn có thể cung cấp một số mã ví dụ mà bạn không chắc chắn nếu nó đang chặn và không chặn không? – Matt

+0

JavaScript nói chung đồng bộ, nhưng setTimeout không đồng bộ theo định nghĩa. Đây là một mồi tốt về nó: https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout –

Trả lời

2

Trong quá trình chạy nút dài sử dụng process.nextTick() để xếp hàng các chức năng/cuộc gọi lại. Điều này thường được thực hiện trong API của nút và trừ khi lập trình của bạn (bên ngoài api) với một cái gì đó đang chặn hoặc mã đó là dài chạy sau đó nó không thực sự ảnh hưởng đến bạn nhiều. Các liên kết dưới đây nên giải thích nó tốt hơn sau đó tôi có thể.

howtonode process.nextTick()

jQuery AJAX cũng mất callbacks và như nó mã hóa của nó không phải chờ đợi để được trả lời máy chủ trước khi chuyển sang các khối tiếp theo của mã. Nó chỉ nhớ các chức năng để chạy khi máy chủ đáp ứng. Điều này dựa trên đối tượng XMLHTTPRequest mà các trình duyệt hiển thị. Đối tượng XHR sẽ nhớ hàm để gọi lại khi đáp ứng trả về.

setTimeout(fn, 0) của javascript sẽ chạy một hàm khi ngăn xếp cuộc gọi trống (dấu tick miễn phí tiếp theo) có thể được sử dụng để tạo async như các tính năng. setTimeout(fn, 0) question on stackoverflow

Để mở rộng khả năng async của javascript, hãy làm nhiều việc với môi trường mà chúng được lập trình dưới dạng bản thân javascript. Bạn không đạt được bất kỳ phép thuật nào bằng cách chỉ sử dụng nhiều cuộc gọi hàm và gọi lại trừ khi bạn sử dụng một số API/tập lệnh.

Jquery Deferred Object Là một liên kết tốt khác cho khả năng không đồng bộ của jQuery. Googling có thể tìm thấy thông tin về cách jQuery Deferred hoạt động để hiểu rõ hơn.

22

Cốt lõi của JavaScript phần lớn là đồng bộ, trong các chức năng đó hoàn thành nhiệm vụ của mình đầy đủ, trước khi hoàn thành. Trước sự ra đời của AJAX, nó thực sự chỉ là setTimeout và setInterval cung cấp hành vi không đồng bộ.

Tuy nhiên, thật dễ dàng để quên rằng trình xử lý sự kiện là mã async hiệu quả. Việc gắn một trình xử lý không gọi mã trình xử lý và mã đó không được thực hiện cho đến khi một thời gian không thể biết được trong tương lai.

Sau đó, đến AJAX, với các cuộc gọi đến máy chủ. Các cuộc gọi này có thể được cấu hình để đồng bộ, nhưng các nhà phát triển thường ưa thích các cuộc gọi không đồng bộ và sử dụng các phương thức gọi lại để thực hiện chúng.

Sau đó, chúng tôi thấy sự gia tăng của các thư viện JS và bộ công cụ. Những điều này giúp đồng nhất hóa việc triển khai các thứ khác nhau của các trình duyệt khác nhau và được xây dựng trên phương pháp gọi lại tới mã không đồng bộ. Bạn cũng bắt đầu thấy nhiều callbacks đồng bộ hơn cho những thứ như lặp mảng hoặc xử lý kết quả truy vấn CSS.

Hiện tại, chúng tôi đang thấy Hoãn và Hứa hẹn trong hỗn hợp. Đây là những đối tượng đại diện cho giá trị của một hoạt động chạy dài và cung cấp một API để xử lý giá trị đó khi nó đến.

NodeJS nghiêng về hướng tiếp cận không đồng bộ với nhiều thứ; điều đó là đúng. Tuy nhiên, đây là một quyết định thiết kế nhiều hơn về phần mình, thay vì bất kỳ bản chất không đồng bộ vốn có nào của JS.

10

Javascript luôn là ngôn ngữ chuỗi đơn đồng bộ (chặn) nhưng chúng tôi có thể làm cho Javascript hoạt động Không đồng bộ thông qua lập trình.

đang Synchronous:

đang
console.log('a'); 
console.log('b'); 

Asynchronous:

console.log('a'); 
setTimeout(function() { 
    console.log('b'); 
}, 1000); 
setTimeout(function() { 
    console.log('c'); 
}, 1000); 
setTimeout(function() { 
    console.log('d'); 
}, 1000); 
console.log('e'); 

đầu ra này: một e b c d

+0

những gì ngăn chặn có nghĩa là trong bối cảnh này? –

Các vấn đề liên quan