typescript - 使用 Typescript 生成器包装 Datatables rows().every()
问题描述
我想用打字稿生成器/迭代器包装 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 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()
.
内置 JS将every()
接受一个迭代器并尝试耗尽它(调用next()
直到迭代器将迭代器标记为完成)。
要使用迭代器(是否由生成器函数创建),通常的方法是在for (... of ...)
. 这将有效地获取每个元素并独立处理它,next()
在每次迭代时适当地调用。
推荐阅读
- php - 带有 fetch Eager 的两个字段的 Doctrine 实体
- drag-and-drop - svelte on drop 事件没有被调用
- android - 将 Google Play 游戏服务添加到现有应用程序
- docker - 如何使用 dockerized Prometheus(和 Grafana)监控 ASP.Net Core 应用程序?
- python - 程序计算最大数量的组合以除数而没有余数
- http - 如何设计两台服务器之间的 HTTP 请求消息
- python - 检查某个布尔值是否连续出现
- java - Hadoop MapReduce ClassNotFound 异常,虽然它在 HADOOP_CLASSPATH 中
- javascript - [TypeError:null 不是对象(评估'DirectSms.sendDirectSms')]
- ruby-on-rails - Rails 查询优化,做错了吗?