đầu hàng! đầu hàng! Cách Trình tạo hoạt động trong JavaScript.


bởi Ashay Mandwarya ?️??

js0jIJmWBpkS7FqofAi1h-JFSyq6FXE1cyC5
Ảnh của Frederik Trovatten.com trên Bapt

Nếu tiêu đề chưa đưa ra gợi ý, chúng ta sẽ thảo luận về máy phát điện trong phần này.

Trước khi đi vào trình tạo, chúng ta hãy xem lại một số điều cơ bản về chức năng.

  • Trong JavaScript, các hàm là một tập hợp các câu lệnh thực hiện một tác vụ và trả về một số giá trị kết thúc hàm.
  • Nếu bạn gọi đi gọi lại một hàm, nó sẽ thực hiện đi thực hiện lại tất cả các câu lệnh.
  • Mũi tên một khi đã rời cung thì không thể dừng lại — chúng chỉ trúng hoặc trượt. Tương tự như vậy, một hàm khi đã được gọi thì không thể dừng lại, nó sẽ chạy, trả về một giá trị, đưa ra một lỗi và sau đó sẽ dừng sau khi thực hiện tất cả các câu lệnh.

Chúng ta chỉ cần ghi nhớ 3 điểm này để hiểu về máy phát điện.

máy phát điện

Trình tạo là một loại chức năng đặc biệt có thể dừng thực thi giữa chừng và sau đó bắt đầu lại từ cùng một điểm sau một thời gian. Trình tạo là sự kết hợp của các hàm và trình vòng lặp. Đây là một tuyên bố hơi khó hiểu nhưng tôi sẽ đảm bảo rằng đến cuối bài viết, dòng này sẽ rõ ràng.

Để rõ ràng hơn, hãy xem xét việc bạn đang chơi một trò chơi và đột nhiên mẹ gọi đi làm một số việc. Bạn tạm dừng trò chơi, giúp cô ấy, sau đó tiếp tục chơi lại. Nó cũng giống như máy phát điện.

Một trình vòng lặp là một đối tượng xác định một chuỗi và có khả năng là giá trị trả về khi kết thúc. — MĐN.

Bản thân các trình vòng lặp là một chủ đề lớn và không phải là mục đích của bài viết này.

Cú pháp cơ bản

Trình tạo được định nghĩa là một hàm có dấu hoa thị

function* name(arguments) {   statements}

bên cạnh chức năng. Tên –

Đọc thêm  Ví dụ đối sánh Regex JavaScript – Cách sử dụng JS Thay thế trên chuỗi

Tên chức năng. tranh luận –

Các đối số cho hàm. các câu lệnh –

Phần thân của hàm.

Trở lạiMột hàm có thể trả về hầu hết mọi thứ, từ một giá trị, đối tượng hoặc chính hàm khác. Hàm trình tạo trả về một đối tượng đặc biệt được gọi là đối tượng trình tạo (không hoàn toàn đúng

{   value: value,  done: true|false}

). Đối tượng trông giống như đoạn mã dưới đây value Đối tượng có hai thuộc tính done. Giá trị chứa giá trị được nhường nhịn. Thực hiện bao gồm một Boolean (đúng|sai) thông báo cho máy phát điện nếu .tiếp theo() sẽ mang lại một giá trị hoặc

không xác định.

Tuyên bố trên sẽ khó tiêu hóa.  Hãy thay đổi điều đó bằng một ví dụ.
function* generator(e) {  yield e + 10;  yield e + 25;  yield e + 33;}var generate = generator(27);
console.log(generate.next().value); // 37console.log(generate.next().value); // 52console.log(generate.next().value); // 60console.log(generate.next().value); // undefined

2GKCXYgOAdydbo5qaKeXPayVwUXMpDPPzY1p

Hãy hiểu cơ chế của từng dòng mã trên. dòng 1–5:

Các dòng 1–5 xác định trình tạo có cùng tên với đối số e. Bên trong phần thân của hàm, nó chứa một loạt các câu lệnh với từ khóa yield và một số thao tác được thực hiện sau đó. dòng 6:

Dòng 6 gán bộ tạo cho một biến có tên là tạo. dòng 8–11: console.log Những dòng này gọi một loạt các next mỗi người gọi máy phát điện bị xích vào một value phương thức gọi cho

thuộc tính của đối tượng trình tạo.

cafqdPSIaj55dp6A5GaErDFtrS0LueYhf87KBất cứ khi nào một hàm tạo được gọi, không giống như các hàm thông thường, nó không bắt đầu thực thi ngay lập tức. Thay vào đó, một iterator được trả về (lý do thực tế * được sử dụng bởi một trình tạo. Nó nói với JS rằng một đối tượng iterator sẽ được trả về next()). Khi mà yield phương thức của trình vòng lặp được gọi, quá trình thực thi của trình tạo bắt đầu và thực thi cho đến khi tìm thấy phương thức đầu tiên next() bản tường trình. Tại điểm năng suất này, đối tượng trình tạo được trả về, các thông số kỹ thuật đã được giải thích. gọi các yield chức năng một lần nữa sẽ tiếp tục chức năng tạo cho đến khi tìm thấy chức năng khác yields tuyên bố và chu kỳ trở lại cho đến khi tất cả

Đọc thêm  Chuỗi JavaScript thành Boolean – Cách phân tích cú pháp Boolean trong JS
đang cạn kiệt.

b8YEAKz8FN0BiZTL-9nWtahqnChK1A0dcnIa next Sau thời điểm này nếu

được gọi, nó trả về đối tượng trình tạo với giá trị không xác định.

Bây giờ, hãy thử tạo một hàm tạo khác từ trình tạo ban đầu và cả một câu lệnh trả về.

cwoYBqzWffwSM5RCEJAUzpsPs-U39zfe6EV1 return Một done property câu lệnh trong trình tạo sẽ làm cho trình tạo kết thúc quá trình thực thi giống như mọi chức năng khác. Các true của đối tượng trình tạo sẽ được đặt thành value value trả lại sẽ được đặt thành yields thuộc tính của đối tượng trình tạo. Tất cả khác undefinedsẽ trở lại

.

Nếu xảy ra lỗi thì quá trình thực thi trình tạo cũng sẽ dừng lại, tạo ra chính trình tạo.

VtjqhfNkczhAnzaY7BmLV1Y7fLs0Du3cVzQP yielding yield một trình tạo, chúng ta cần chỉ định * đối với yield* để nói với JS rằng một trình tạo được tạo ra. Các yield ủy quyền cho một hàm tạo khác – đó là lý do chúng ta có thể generator2 tất cả các giá trị của generate.next() chức năng sử dụng yielded của hàm tạo ban đầu. Giá trị đầu tiên yielded là từ hàm tạo đầu tiên và hai hàm cuối cùng yielded các giá trị được tạo bởi hàm tạo nhưng

bởi máy phát ban đầu.

Thuận lợi

tải chậm

Tải chậm về cơ bản chỉ là đánh giá giá trị khi có nhu cầu. Như chúng ta sẽ thấy trong một ví dụ sắp tới, chúng ta thực sự có thể làm điều đó với máy phát điện. Chúng tôi chỉ có thể mang lại các giá trị khi cần thiết chứ không phải tất cả cùng một lúc. next() Ví dụ dưới đây là từ một ví dụ khác trong bài viết này và nó tạo ra các số ngẫu nhiên vô hạn. Ở đây chúng ta có thể thấy chúng ta có thể gọi bao nhiêu

như chúng ta muốn và không nhận được tất cả các giá trị mà nó đang tạo ra.  Chỉ những cái cần thiết.
function * randomize() {  while (true) {let random = Math.floor(Math.random()*1000);    yield random;  }}
var random= randomize();
console.log(random.next().value)

0uRO5-e1uAChjJR9-m21IhjV46cZ7tzH10Xl

Bộ nhớ hiệu quả

Như chúng ta có thể suy luận từ ví dụ trên, các trình tạo cực kỳ hiệu quả về bộ nhớ. Vì chúng tôi chỉ muốn các giá trị theo nhu cầu, nên chúng tôi cần rất ít dung lượng lưu trữ để lưu trữ các giá trị đó.

cạm bẫy

  • Máy phát điện cực kỳ hữu ích nhưng cũng có những cạm bẫy riêng. Trình tạo không cung cấp quyền truy cập ngẫu nhiên
  • như mảng và các cấu trúc dữ liệu khác. Vì các giá trị được đưa ra từng cái một khi gọi nên chúng tôi không thể truy cập các phần tử ngẫu nhiên. Máy phát điện cung cấp quyền truy cập một lần.

Trình tạo không cho phép bạn lặp đi lặp lại các giá trị. Khi tất cả các giá trị đã hết, chúng ta phải tạo một phiên bản Trình tạo mới để lặp lại tất cả các giá trị.

Tại sao chúng ta cần Máy phát điện?

Đọc thêm  Cách chuyển các hàm gọi lại cho String.replace() trong JavaScript

Trình tạo cung cấp nhiều cách sử dụng trong JavaScript. Hãy cố gắng tạo lại một số chính mình.

Triển khai Iterator một trình vòng lặp

là một đối tượng cho phép lập trình viên duyệt qua vùng chứa -Wikipedia

Chúng tôi sẽ in tất cả các từ có trong một chuỗi bằng cách sử dụng các trình vòng lặp. Các chuỗi cũng là các trình vòng lặp.

vòng lặp
const string = 'abcde';const iterator = string[Symbol.iterator]();console.log(iterator.next().value)console.log(iterator.next().value)console.log(iterator.next().value)console.log(iterator.next().value)console.log(iterator.next().value)

jxlJeu0eRnrbnVoQQiUnQWuW6WRqy6lewlui

Đây là điều tương tự khi sử dụng máy phát điện
function * iterator() {yield 'a';yield 'b';yield 'c';yield 'd';yield 'e';}for (let x of iterator()) {console.log(x);}

BLoMgkxRn2Um8XnncvONthkIzSnwnDtLZxtd

  • So sánh cả hai phương pháp, dễ dàng nhận thấy rằng với sự trợ giúp của trình tạo, chúng ta có thể thực hiện điều đó với ít lộn xộn hơn. Tôi biết đó không phải là một ví dụ hay nhưng đủ để chứng minh những điểm sau: next()
  • Không thực hiện [Symbol.iterator]() Không
  • lời kêu gọi object.done Trong một số trường hợp, chúng ta thậm chí cần thiết lập

thuộc tính trả về giá trị đúng/sai bằng cách sử dụng các trình vòng lặp.

Async-Await ~ Promises+Generators

Bạn có thể đọc bài viết trước của tôi về Async/Await nếu bạn muốn tìm hiểu về chúng và xem phần này để biết Promise.

Nói một cách thô thiển, Async/Await chỉ là một triển khai của Trình tạo được sử dụng với Lời hứa.

async function async-await(){let a=await(task1);console.log(a);
let b=await(task2);console.log(b);
let c=await(task3);console.log(c);
}

Async-Await

function * generator-promise(){let a=yield Promise1();console.log(a);let b=yield Promise1();console.log(b);let c=yield Promise1();console.log(c);
}

Lời hứa + Máy phát điện

Như chúng ta có thể thấy, cả hai đều tạo ra cùng một kết quả và gần như theo một cách tương tự. Đó là bởi vì cơ chế Async/Await dựa trên sự kết hợp giữa các trình tạo và lời hứa một cách lỏng lẻo. Còn rất nhiều điều về Async/Await so với trình bày ở trên, nhưng chỉ để hiển thị việc sử dụng trình tạo, chúng ta có thể xem xét điều này.

Cấu trúc dữ liệu vô hạn

Tiêu đề có thể gây hiểu lầm một chút, nhưng đó là sự thật.  Chúng ta có thể tạo các trình tạo, với việc sử dụng vòng lặp while sẽ không bao giờ kết thúc và sẽ luôn mang lại một giá trị.
function * randomize() {  while (true) {let random = Math.floor(Math.random()*1000);    yield random;  }}var random= randomize();while(true)console.log(random.next().value)

ximCs8aJ4EUtQfo8AAPza6eRK9IAUd70QLCN next() Trong đoạn mã trên, chúng tôi tạo một trình tạo vô hạn, sẽ mang lại một số ngẫu nhiên trên mỗi

lời kêu gọi. Nó có thể được gọi là một dòng số ngẫu nhiên vô tận. Đây là một ví dụ rất cơ bản.

Phần kết luận

Vẫn còn rất nhiều điều cần được đề cập về máy phát điện và đây chỉ là phần giới thiệu về chủ đề này. Hy vọng bạn đã học được điều gì đó mới và bài viết rất dễ hiểu.

Theo tôi và vỗ tay!

dagqbne49wWylj3wlhZWGKij2pXISMlkKyn6



Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status