Как в этом коде работают генераторы?

Кто-нибудь может объяснить, как работает этот код? Я исследовал, как я могу создавать циклы для очистки с помощью кошмара JS, и нашел это, это работает, но я просто не могу понять, как это работает или как это можно написать без генераторов.

var Nightmare = require('nightmare');
var vo = require('vo');
vo(run)(function(err, result) {
if (err) throw err;
});

function* run() {
var nightmare = Nightmare(),
MAX_PAGE = 10,
currentPage = 0,
nextExists = true,
links = [];

yield nightmare
    .goto('https://www.yahoo.com')
    .type('#uh-search-box', 'github nightmare')
    .click('#uh-search-button')
    .wait('ol.searchCenterMiddle')


nextExists = yield nightmare.visible('.next');

while (nextExists && currentPage < MAX_PAGE) {
    links.push(yield nightmare
        .evaluate(function() {
            var links = document.querySelectorAll("ol.searchCenterMiddle a");
            console.log(links[0].href);
            return links[0].href;
        }));

        yield nightmare
            .click('.next')
            .wait('body')

        currentPage++;
        nextExists = yield nightmare.visible('.next');
}
console.dir(links);
yield nightmare.end();
}

person Caio Fontes    schedule 25.09.2017    source источник
comment
Вы можете использовать цикл Promise и for..of или async/await для достижения того же результата, см. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/, developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/, stackoverflow.com/questions/43547606/   -  person guest271314    schedule 25.09.2017
comment
Я настоятельно рекомендую эту серию статей davidwalsh.name/es6-generators.   -  person Mertcan Diken    schedule 25.09.2017