Generator function javascript là gì
Trong javascript một khi function được thực thi thì nó sẽ được đảm bảo 3 tức là những phần code khác không thể can thiệp, làm gián đoạn quá trình chạy của function đó. Tuy nhiên ES6 đã cho ra mắt 1 loại function mới mà không hành xử theo lẽ thông thường như thế - 4 Show Hãy xem xét ví dụ sau đây:
Chúng ta có thể thấy function 5 được gọi bên trong function 6 và giá trị của x sau khi gọi foo() là 3. Trong trường hợp không có lời gọi 7 bên trong 6 giá trị của 9 sẽ là 2. Hãy tưởng tượng bằng 1 cách nào đó mặc dù chúng ta không gọi 7 ở bên trong 6 mà kết quả trả về vẫn là 3 ??? Đó chính là lúc mà chúng ta sử dụng 2Hãy thay đổi đoạn code 1 chút
Bạn có để ý thấy sự khác biệt ? Chúng ta đã có 1 3 với khai báo 4 - chú ý dấu 5 trong phần khai báo.Và sử dụng 2 như sau
Xem xét từng bước một của quá trình trên: Như vậy chúng ta có thể gọi 5 bên ngoài 6 và kết quả cuối cùng của 9 vẫn là 3. Chúng ta có thể coi điều này như là 1 sự phá vỡ rule 3 của functionInput và output 2 là 1 function đặc biệt nhưng nó vẫn là 1 function nên nó vẫn có thể có tham số truyền vào - 2 và giá trị trả về - 3 như 1 function thông thường.
Chúng ta vẫn có thể truyền giá trị đầu vào 6 và 7 cho 9 và 5Cách gọi function cũng khá quen thuộc - 6 nhưng cách mà chúng ta nhận về kết quả có đôi chút khác biệt.Đầu tiên 6 không thực thi function từ đầu đến cuối mà như đã đề cập lúc trước, nó tạo ra 1 8. Khi 9 được gọi, nó thực thi các lệnh trong function cho đến khi gặp 0 hoặc kết thúc function. Giá trị trả về của lênh 9 này là 1 object có thuộc tính 2 và chúng ta sẽ lấy giá trị từ thuộc tính này.Iteration MessagingVới lệnh 0 đứng độc lập, ta có thể coi đó như 1 điểm dừng để thực hiện những xử lí chen vào giữa quá trình thực thi của function (có vẻ giống 4 mà mình vẫn hay dùng) nhưng thực thế là cách sử dụng của nó còn linh hoạt hơn thế.
Ở đây ta có thể sử dụng 0 như 1 nơi để truyền tham số vào Chuôĩ câu lệnh trên truyền 6 là giá trị đầu vào cho 9 và truyền 7 như là gía trị cho 0 và gía trị sau khi tính toán là 6*7=42.Câu chuyện ở đây là gì ? Câu lệnh 8 đầu tiên bắt đầu 2 và chạy cho đến khi gặp 0. Khi gặp lệnh 0, 0 đặt ra câu hỏi giá trị truyền vào ở đây là gì. Câu lệnh 8 đầu tiên đã hoàn thành xong nhiệm vụ của mình vậy nên trách nhiệm trả lời này sẽ nằm trong câu lệnh 8 tiếp theo. Khi lệnh 8 tiếp theo được thực hiện, nó trả lời cho câu hỏi mà 0 đặt ra mà thực thi nốt phần còn lại.Muliple iteratorsMỗi khi chúng ta tạo một iterator thì chúng ta cũng đã tạo 1 generator instance. Khi có nhiều instance của cùng 1 generator thì chúng có thể tương tác với nhau.
Trong đoạn code trên thì khi khởi tạo 7 và 8 chúng ta có 2 generator instance của generator 6. Chú ý lệnh 0 có tác dụng như lệnh 0 không có tham số nhưng có thêm tác dụng gán 2vào thuộc tính 2 của iterator tại thời điểm câu lệnh 8 thực thi xong. Trong ví dụ trên giá trị của 7 và 8 có thể nhận iterator còn lại làm tham số trong quá trình tính toán của mình. Đối với trường hợp 2 8 của 2 2 khác nhau tùy theo cách thực hiện các step trong function của các generator mà kết quả trả về rất khác nhau. Hiện tượng 9 xảy ra và nó tương tự như việc xung đột tài nguyên giữa các thread trong các ngôn ngữ hỗ trợ multi-thread vậy.Ví dụ với 2 generator sau:
Nếu 6 và 5 là 2 function thông thường thì kết quả khi thực thiện foo, bar sẽ chỉ có 2 case:
Nó chính là các case có thể xảy ra khi xử lí không đồng bộ 6 và 5. Nhưng với 2 - thứ phá vỡ luật 3, việc xen kẽ các step của 6 và 5 là điều có thể. Số lượng cách sắp xếp các step trộn lẫn với nhau cũng như số lượng kết quả trả về là khá nhiều và phức tạp.ValuesGenerator IteratorGeneral iterator có thể sử dụng khi cần tính toán 1 chuỗi giá trị mà giá trị sau phụ thuộc vào giá trị trước. Mỗi lần gọi 8 chúng ta lại có thể nhận được 1 gía trị mới. Công việc này cũng có thể thực hiện bằng 3.
Mỗi lần gọi 6 chúng ta nhận được 1 giá trị mới của chuỗi số.Với phong cách của 2 chúng ta có thể định nghĩa 1 2 và cho chạy loop qua 2 đó
Cách viết này sử dụng vòng lặp 8 - bình thường sẽ gây 9 tuy nhiên với lệnh 0 đặt bên trong loop 2 sẽ dừng lại tại mỗi lần lặp, lệnh 0 cũng giữ lại gía trị của function foo mà không cần đến closure để lưu lại biến trạng thái. Khi thực hiện lệnh 3chúng ta vẫn có thể ngắt vòng lặp bằng cách check điều kiện và break.Iterating Generators AsynchronouslyVới các mẫu xử lí không đồng bộ, 2 đem đến 1 cách tiếp cận mới. Dưới đây là 1 mẫu xử lí không đồng bộ kinh điển sử dụng câu lệnh ajax.
Javascript generator function là gì?1) Generator function là gì
Generator đóng vai trò cơ bản để xây dựng các phương thức xử lý bất đồng bộ khác (side effect), ví dụ: async/await, sagas. Generator function là một function, có khả năng tạm ngưng thực thi trước khi hàm kết thúc, và có thể tiếp tục chạy ở 1 thời điểm khác.
Generator object là gì?Object generator này là một iterator nên chúng ta có thể sử dụng nó trong vòng lặp for-of hoặc trong các fucntion khác chấp nhận đối số truyền vào là iterable. Ở dòng 4 thì chúng ta gọi hàm next() trên generatorObject . Với lời gọi này thì generator bắt đầu được thực thi chức năng của nó.
|