Обернуть строки данных (). Every () с генераторами Typescript - PullRequest
0 голосов
/ 10 декабря 2018

Я хочу обернуть строки (). Каждая функция с генераторами / итераторами машинописи

Это мой первый подход

public * rowIterator1(): IterableIterator<DataTables.RowMethods> {

    var self = this.dataTable;
    this.dataTable.rows().every(function*(rowIdx) {
        console.log(rowIdx);
        let row = self.row(rowIdx);

        yield row;
    });

}

Но функция every () не останавливается, когда yieldстрока называется.

Следующий подход был с асинхронными генераторами

public async * rowIterator3() {

    yield await new Promise((res) => {
        var self = this;
        this.dataTable.rows().every(function (rowIdx) {
            console.log(rowIdx);
            let row = self.dataTable.row(rowIdx);

            res(row);
        });

    });
}

Та же проблема, console.log говорит:

0 1 2 3 4

Функция не останавливается при вызове yield

В конце я хотел бы получить что-то вроде этого:

DtWrapper.rows((row: JQuery, index: number) => {
   do something
}

Ну, после нескольких часов игры это кажетсяРабота.Хотя использование итератора не то, что я ожидал.

public * getRows() {    

        let rowIndexes = this.dataTable.rows().indexes();
        let count = rowIndexes.length;

        for (var i = 0; i < count; i++) {
            let rowIndex = rowIndexes[i];
            let row = this.dataTable.row(rowIndex);
            yield $(row.node());
        }
    }

    public test() {


        let t = this.getRows(true);

        let a = t.next();
        a = t.next();
        a = t.next();

}

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Я разработал решение, которое будет работать на меня.(Thx @ Pac0 для правильного ввода)

function* func1() {
  yield 42;
  yield 2;
}

function* func2(param) {
    if (param)
    return;
  yield* func1();
}



for (var value of func2(true))
{
    console.log(value);
}
console.log("finished true");

for (var value of func2(false))
{
    console.log(value);
}
console.log("finished false");

Вот рабочая скрипка https://jsfiddle.net/qu9ksxpd/

0 голосов
/ 10 декабря 2018

Итератор фактически прекратит выполнение при каждом выходе, когда вы вызовете его, используя next().

Встроенный JS every() примет итератор и попытается его исчерпать (вызывая next() до итераторапометить итератор как выполненный).

Чтобы использовать итератор (созданный функцией-генератором или нет), обычным способом является его использование в for (... of ...).Это будет эффективно получать каждый элемент и обрабатывать его независимо, вызывая next() соответствующим образом на каждой итерации.

...