Ví dụ này là JavaScript, vì đó là nơi tôi đang sử dụng hầu hết các cuộc gọi lại. Tôi muốn hiểu cách họ làm việc ở mức độ thấp.Các cuộc gọi lại luôn không đồng bộ?
Trong ví dụ bên dưới, tôi hy vọng mọi thứ sẽ xảy ra theo thứ tự và "gọi lại" sẽ xảy ra sau "bước 3" và trước "bước 4." Điều này có ý nghĩa với tôi, vì mọi thứ đều được thực hiện theo thứ tự trên một luồng thực thi duy nhất. Không có thủ đoạn. Điều duy nhất đặc biệt là bạn đã chuyển một hàm tới một hàm khác.
function main() {
console.log("step 1");
console.log("step 2");
doSomething(myCallBack);
console.log("step 4");
}
function doSomething(f) {
accessTheDatabase(); // this could take a while
console.log("step 3");
f(); // done - now call back
}
function myCallBack() {
console.log("calling back!");
}
Làm thế nào bạn sẽ làm cho doSomething
không đồng bộ để "bước 4" có thể được thực hiện trước khi, hoặc song song với "bước 3"?
Tôi giả định rằng nếu doSomething
được gọi bằng cách nào đó không đồng bộ, nó sẽ phải nằm trên một chuỗi khác nhau, phải không? Và nếu như vậy, khi nó kết thúc và sau đó gọi myCallBack
, không gọi lại xảy ra trên chủ đề thứ hai hoặc trên chủ đề chính? Nếu nó xảy ra trên luồng chính, tại sao luồng thứ hai lại cần một con trỏ tới hàm gọi lại? Cuộc gọi giữa các luồng hoạt động như thế nào?
Tôi cho rằng điều này là * không * đang chạy trong trình duyệt, phải không? Bởi vì trong trình duyệt, bất kỳ cuộc gọi AJAX nào là không đồng bộ ... –
@Dean, trước hết các yêu cầu XHR có thể bằng đồng bộ (tùy thuộc vào các tham số yêu cầu). Thứ hai, nếu bạn đọc câu hỏi (và nhìn vào mã ví dụ của nó), nó không phải là về Ajax. – eyelidlessness
@Dean nó có thể đang chạy trong trình duyệt hay không. Tôi quan tâm nhất trong việc tìm ra liệu chức năng gọi lại được thực thi trên luồng chính hay luồng thứ hai đã được chuyển qua con trỏ hàm gọi lại như một tham số. –