Автор оригинала: Adenekan Wonderful.
В этом уроках мы собираемся исследовать один действительно отличный новый ISHHHH, который был введен в экосистему JavaScript и уроженец для JavaScript теперь, более того, мы больше всего случаев говорят, что это функция, которая напоминает Async/ждать
Веселый факт – Async await на самом деле построен на генераторах 😆
Теперь не поймите меня неправильно, не совсем не именно асин/ждут, что она получила почти другую вспышку, но это очень похоже в том смысле, что в функциях Async/ждут, мы ждем наших асинхронных событий (наши обещанные события), где мы приостановим Исполнение внутри нашего асинхронного, когда мы видим вызов ждут.
Ну, наши функции генератора очень похожи в том смысле, что они также приодоварит их казни, когда они видят определенный ключ внутри их функции, и этот ключ называется выходом. Теперь, в других, для нас, для нас, чтобы использовать это или достичь этого, есть специальный синтаксис, который мы фактически должны объявить наш старый школьный способ определения нашего функционального декоратора, но на этот раз со звездой рядом с ним.
//codes here function* gen(){ // code goes here }
Теперь давайте лучше понять эти вещи, давайте объявляем две консоли и увидеть что-то здесь
//codes here function* gen(){ console.log('Hello There'); console.log('I am a generator'); } // Now i'd declear my gen function to a const const gfunc = gen() // this would return undefined //when i call gfunc in the console i get these weird suspended and they are called a generator object /* gen {} __proto__: Generator [[GeneratorLocation]]: VM275:1 [[GeneratorStatus]]: "suspended" [[GeneratorFunction]]: ƒ* gen() [[GeneratorReceiver]]: Window [[Scopes]]: Scopes[3] **/
Теперь я знаю, что вы можете быть очень удивлены тем, что происходит, и почему он не делает наши регулярные исполнения функций, где мы увидели наши журналы и все, но вот что мы делаем на этом, мы называем .Next ()
На нем и что .Next ()
Соответствует ли я бы возобновить казнь внутри нашей функции, поэтому в точке, когда мы вступили в первый раз, мы создали этот генераторный объект, который на самом деле знает о коде внутри нашей функции, но выполнение внутри Gen ()
Функция приостановлена. Я знаю, что это может быть много, но это легко, что мы делаем, и другое, чтобы возобновить эту функцию, мы просто называем .Next ()
на GFunc const так, пока мы не позвоним .Next () на нашу функцию, возможно, не сможет запустить выполнение
gfunc.next() //Now this returns some things I want you to take note of Hello There I am a generator { value: undefined, done: true }
Теперь мы получаем наш журнал и дополнительный объект, и этот объект содержит наше значение PROP и выполненное свойство, теперь выполненное свойство сообщает нам, если есть какой-либо код, чтобы все еще запустить и в нашем случае, нет ничего, так что мы получаем правда. Теперь давайте рассмотрим это и пойти на что-то немного продвижение
function* gen(i){ yield i; yield i + 5; } cosnt gfunc = gen(5)
Итак, теперь, что мы сделали, это то, что у нас есть функция GON (), которая принимает i в качестве аргумента, и тогда мы даем аргумент, который мы анализируем, а аргумент плюс 5, тогда мы объявили Const и дали ему значение 5. Мы хороши? ДА! Поэтому, когда мы называем GFUNC.Next () Давайте посмотрим, что мы получаем.
gfunc.next() //returns { value: 5, done: false }
Итак, теперь мы видим, что свойство Value в объекте является первоначальная доходность, которую мы отображали в функции, и сделано ложно, почему? Теперь это потому, что мы не делаем, играя наше казнь в функции, что означает, что в функции есть еще, что она больше приостановлена после нашего первого урожая, теперь давайте посмотрим, что произойдет, когда мы делаем .Next () снова
gfunc.next() //returns { value: 10, done: false }
Теперь мы видим, что свойство Value в объекте теперь содержит наше обновленное значение, и наше выполненное свойство все еще ложно, теперь это потому, что в нашей функции текучести мы никогда не объявили о возвращаемом значении, и это требуется, поэтому наша функция генератора может знать, когда наша функция генератора может знать, когда остановится выполнение. так что теперь, если мы добавим возвращаемое значение, мы видим, что наша сделана возвращает True, как это
function* gen(i){ yield i; yield i + 5; return 20; } cosnt gfunc = gen(5) // first execution gfunc.next() //returns { value: 5, done: false } //second execution gfunc.next() //returns { value: 10, done: false } //final execution gfunc.next() //returns { value: 20, done: true }
Теперь вы видите, что у нас есть наша доброе значение так же, как выполнение выполнения. Это в первую очередь базовое использование генераторных функций, если вы хотите скрыть несколько выполнений, но вы хотите управлять, когда вы хотите сделать паузу и воспроизвести выполнение. думать об этом как
Способность приостановить функции
Я думаю, что мы должны остановиться здесь сейчас. Таким образом, ключевое то, что вам нужно помнить, где бы мы ни увидим доход, что означает, что наш код приостановлен в тот момент, даже если его асинхронный код, как async/ждут.
Я знаю, что мы провели много времени, говоря о функциях генератора, но тогда, если вы все еще не понимаете, вы можете пересмотреть статью снова и снова или я, но в некоторых отличных ресурсах помочь вашему обучению. Увидимся в моих других статьях 😊