JavaScript hoạt động không đồng bộ như thế nào?

Khi sử dụng hàm JavaScript setTimeout[], bạn có thể chỉ định hàm gọi lại sẽ được thực thi khi hết thời gian chờ

Ví dụ

setTimeout[myFunction, 3000];

function myFunction[] {
  tài liệu. getElementById["bản trình diễn"]. internalHTML = "Anh yêu em. ";
}

Tự mình thử »

Trong ví dụ trên, myFunction được sử dụng như một cuộc gọi lại

myFunction được chuyển đến setTimeout[] như một đối số

3000 là số mili giây trước khi hết thời gian, do đó, myFunction[] sẽ được gọi sau 3 giây

Ghi chú

Khi bạn chuyển một hàm làm đối số, hãy nhớ không sử dụng dấu ngoặc đơn

Đúng. setTimeout[myFunction, 3000];

Sai. setTimeout[myFunction[], 3000];

Thay vì chuyển tên của một hàm làm đối số cho một hàm khác, thay vào đó, bạn luôn có thể chuyển toàn bộ hàm

Ví dụ

setTimeout[function[] { myFunction["Anh yeu em. "]; }, 3000];

function myFunction[value] {
  tài liệu. getElementById["bản trình diễn"]. innerHTML = giá trị;
}

Tự mình thử »

Trong ví dụ trên, function[]{ myFunction["I love You !!!"]; } được sử dụng như một cuộc gọi lại. Nó là một chức năng hoàn chỉnh. Hàm hoàn chỉnh được chuyển đến setTimeout[] làm đối số

3000 là số mili giây trước khi hết thời gian, do đó, myFunction[] sẽ được gọi sau 3 giây

Đang chờ khoảng thời gian

Khi sử dụng hàm JavaScript

const getPromise = [] => Promise.resolve['My return value'];const myFunction = [] => {
getPromise[]
.then[val => {
console.log[val]; // prints 'My return value'
}] // If there is an error in any of the above promises, catch
// it here
.catch[error => {
console.error[error.message];
}];
}
10, bạn có thể chỉ định hàm gọi lại sẽ được thực thi cho mỗi khoảng thời gian

Ví dụ

setInterval[myFunction, 1000];

function myFunction[] {
  let d = new Date[];
  tài liệu. getElementById["bản trình diễn"]. innerHTML=
  d. getHours[] + ". " +
  d. getMinutes[] + ". " +
  d. getSeconds[];
}

Tự mình thử »

Trong ví dụ trên, myFunction được sử dụng như một cuộc gọi lại

myFunction được chuyển đến

const getPromise = [] => Promise.resolve['My return value'];const myFunction = [] => {
getPromise[]
.then[val => {
console.log[val]; // prints 'My return value'
}] // If there is an error in any of the above promises, catch
// it here
.catch[error => {
console.error[error.message];
}];
}
10 như một đối số

1000 là số mili giây giữa các khoảng thời gian, do đó, myFunction[] sẽ được gọi mỗi giây

Các lựa chọn thay thế gọi lại

Với lập trình không đồng bộ, các chương trình JavaScript có thể bắt đầu các tác vụ chạy dài và tiếp tục chạy song song các tác vụ khác

Tuy nhiên, các chương trình không đồng bộ rất khó viết và khó gỡ lỗi

Do đó, hầu hết các phương thức JavaScript không đồng bộ hiện đại không sử dụng lệnh gọi lại. Thay vào đó, trong JavaScript, lập trình không đồng bộ được giải quyết bằng Promises

Công cụ JavaScript là một luồng đơn và sử dụng một vòng lặp sự kiện. Nói một cách đơn giản, điều này có nghĩa là bất kỳ câu lệnh nào bạn chạy sẽ được thực hiện lần lượt trong một quy trình. Để tránh chặn cuộc gọi, có một số kỹ thuật mà JavaScript sử dụng để tránh phải chờ đợi trong khi tính toán. Đây là các chức năng không đồng bộ

Bạn có thể đọc thêm về vòng lặp sự kiện tại đây vì chủ đề quá sâu để trình bày trong bài đăng này

JavaScript cung cấp ba phương thức xử lý mã không đồng bộ. gọi lại, cho phép bạn cung cấp các chức năng để gọi sau khi phương thức không đồng bộ chạy xong;

gọi lại

Phương pháp ban đầu để xử lý tính không đồng bộ. Gọi lại cho phép bạn cung cấp một chức năng sẽ được thực thi sau khi mã không đồng bộ kết thúc. Trong ví dụ bên dưới,

const getPromise = [] => Promise.resolve['My return value'];const myFunction = [] => {
getPromise[]
.then[val => {
console.log[val]; // prints 'My return value'
}] // If there is an error in any of the above promises, catch
// it here
.catch[error => {
console.error[error.message];
}];
}
6 lấy một hàm làm đối số và sẽ gọi hàm đó khi hoàn thành

Phương pháp này, chuyển qua lại các hàm, có thể trở nên rất khó hiểu nếu bạn cần xâu chuỗi một số lệnh gọi này lại với nhau. Cuộc gọi lại sẽ cần được chuyển xuống chuỗi thực thi để được gọi ở cuối quy trình cuối cùng

const functionWithACallback = [callback] => {
//do some work then call the callback once done
console.log['You called this function!'];
setTimeout[[] => {
callback['I am done'];
}, 1000]
};
const myFunction = [] => {
// the function we want to call when the work is done
const myCallback = console.log
// this will call myCallback once it is finished
functionWithACallback[myCallback];
};
myFunction[];
// You called this function
// I am done

lời hứa

Một trong những vấn đề chính với các cuộc gọi lại là, khi xâu chuỗi một số lệnh gọi hàm lại với nhau, việc theo dõi luồng thực thi có thể trở nên khó khăn hơn. Các lời hứa nhằm mục đích giải quyết vấn đề này bằng cách cho phép bạn kết hợp các lời hứa với nhau bằng cú pháp

const getPromise = [] => Promise.resolve['My return value'];const myFunction = [] => {
getPromise[]
.then[val => {
console.log[val]; // prints 'My return value'
}] // If there is an error in any of the above promises, catch
// it here
.catch[error => {
console.error[error.message];
}];
}
7. Ví dụ bên dưới hoạt động giống như ví dụ gọi lại, nhưng dễ theo dõi hơn nhiều. đợi cho đến khi
const getPromise = [] => Promise.resolve['My return value'];const myFunction = [] => {
getPromise[]
.then[val => {
console.log[val]; // prints 'My return value'
}] // If there is an error in any of the above promises, catch
// it here
.catch[error => {
console.error[error.message];
}];
}
8 hoàn thành rồi gọi hàm chứa
const getPromise = [] => Promise.resolve['My return value'];const myFunction = [] => {
getPromise[]
.then[val => {
console.log[val]; // prints 'My return value'
}] // If there is an error in any of the above promises, catch
// it here
.catch[error => {
console.error[error.message];
}];
}
9

Xử lý lỗi với lời hứa cũng ít phức tạp hơn. Thay vì gọi cuộc gọi lại với một đối tượng lỗi, các lời hứa cung cấp một trình bao bọc

const getPromise = [] => Promise.resolve['My return value'];const myFunction = [] => {
getPromise[]
.then[val => {
console.log[val]; // prints 'My return value'
}] // If there is an error in any of the above promises, catch
// it here
.catch[error => {
console.error[error.message];
}];
}
0 để giúp quản lý các trạng thái lỗi. Bên dưới, khối
const getPromise = [] => Promise.resolve['My return value'];const myFunction = [] => {
getPromise[]
.then[val => {
console.log[val]; // prints 'My return value'
}] // If there is an error in any of the above promises, catch
// it here
.catch[error => {
console.error[error.message];
}];
}
1 sẽ được thực thi nếu xảy ra lỗi trong bất kỳ lời hứa nào ở trên nó

const getPromise = [] => Promise.resolve['My return value'];const myFunction = [] => {
getPromise[]
.then[val => {
console.log[val]; // prints 'My return value'
}] // If there is an error in any of the above promises, catch
// it here
.catch[error => {
console.error[error.message];
}];
}

Không đồng bộ/Đang chờ

Trong các phiên bản JavaScript gần đây hơn, các từ khóa

const getPromise = [] => Promise.resolve['My return value'];const myFunction = [] => {
getPromise[]
.then[val => {
console.log[val]; // prints 'My return value'
}] // If there is an error in any of the above promises, catch
// it here
.catch[error => {
console.error[error.message];
}];
}
2 và
const getPromise = [] => Promise.resolve['My return value'];const myFunction = [] => {
getPromise[]
.then[val => {
console.log[val]; // prints 'My return value'
}] // If there is an error in any of the above promises, catch
// it here
.catch[error => {
console.error[error.message];
}];
}
0 đã được thêm vào. Điều này cung cấp một phương pháp viết lời hứa rõ ràng hơn và cho phép người dùng kiểm soát nhiều hơn đối với thứ tự thực hiện. Ví dụ dưới đây giống với ví dụ về lời hứa về chức năng, nhưng được viết bằng từ khóa
const getPromise = [] => Promise.resolve['My return value'];const myFunction = [] => {
getPromise[]
.then[val => {
console.log[val]; // prints 'My return value'
}] // If there is an error in any of the above promises, catch
// it here
.catch[error => {
console.error[error.message];
}];
}
2 và
const getPromise = [] => Promise.resolve['My return value'];const myFunction = [] => {
getPromise[]
.then[val => {
console.log[val]; // prints 'My return value'
}] // If there is an error in any of the above promises, catch
// it here
.catch[error => {
console.error[error.message];
}];
}
0

Chủ Đề