【发布时间】:2018-12-10 08:21:52
【问题描述】:
我想用打字稿生成器/迭代器包装 rows().every 函数
这是我的第一个方法
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 行时 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();
}
【问题讨论】:
-
但
every的思想/算法是“取每个元素,直到迭代器用尽”。如果您想一次迭代一个元素,请使用for (... of ...)(或直接使用迭代器)。 -
你到底想达到什么目的?
-
我想将数据表组件包装在一个包装类中。这个 Wrapper 应该有一个迭代器函数来迭代表行。迭代器函数应该只返回节点(JQuery)和行的索引,而不是行对象本身。
标签: typescript datatables iterator datatables-1.10