使用 Typescript 生成器包装数据表 rows().every()
Wrap Datatables rows().every() with Typescript Generators
我想用 typescript 包装 rows().every 函数 generators/iterator
这是我的第一个方法
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;
});
}
但是调用 yield row 时 every() 函数并没有停止。
下一个方法是使用异步生成器
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();
}
当您使用 next()
.
调用它时,迭代器将在每次 yield 时有效地停止执行
every()
内置 JS 将接受一个迭代器并尝试耗尽它(调用 next()
直到迭代器将迭代器标记为完成)。
要使用迭代器(无论是否由生成器函数创建),通常的方法是在 for (... of ...)
中使用它。这将有效地获取每个元素并独立对待它,在每次迭代时适当地调用 next()
。
我已经开发出适合我的解决方案。 (感谢@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");
这是一个有效的 fiddle https://jsfiddle.net/qu9ksxpd/
我想用 typescript 包装 rows().every 函数 generators/iterator
这是我的第一个方法
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;
});
}
但是调用 yield row 时 every() 函数并没有停止。
下一个方法是使用异步生成器
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();
}
当您使用 next()
.
every()
内置 JS 将接受一个迭代器并尝试耗尽它(调用 next()
直到迭代器将迭代器标记为完成)。
要使用迭代器(无论是否由生成器函数创建),通常的方法是在 for (... of ...)
中使用它。这将有效地获取每个元素并独立对待它,在每次迭代时适当地调用 next()
。
我已经开发出适合我的解决方案。 (感谢@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");
这是一个有效的 fiddle https://jsfiddle.net/qu9ksxpd/