如何实现一个批量获取数据的dataloader,合并多个操作

Posted 黄小波波

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现一个批量获取数据的dataloader,合并多个操作相关的知识,希望对你有一定的参考价值。

写在前面,dataloader代码已经很少了,只有三百行而且一半是注释。但是我就是想写

/**
  *一个接受 ids 然后返回结果的函数handle,
 * 对这个handle进行封装,返回一个loader
 * 每次通过调用loader来调用handle
 * 每接收到一个对loader的调用
 * 就存储起来,并不立即执行handle
 * 而是收集loader的参数id,并且将多个id合并为ids
 * 最后在js执行的末尾,调用一次handle(ids)这样
 *
 * @export
 * @param {(id: number) => {}} handle
 */
export default function Dataloader<T>(handle: (ids: number[]) => Promise<T[]>) {
    const cachesMap = {};
    const loader = {
        cacheIdsQue: [] as {id: number; resolve: Function; reject: Function}[],
        load: function (id: number) {
            const quePromise = new Promise((resolve, reject) => {
                this.cacheIdsQue.push({
                    id,
                    resolve,
                    reject
                });
                if (this.cacheIdsQue.length === 1) {
                    this.nextTickRun();
                }
            })
            return quePromise;
        },
        nextTickRun() {
            Promise.resolve().then(() => {
                if (this.cacheIdsQue.length) {
                    const cacheIdsQue = this.cacheIdsQue;
                    const results = handle(this.cacheIdsQue.map(ref => ref.id));
                    results.then((values) => {
                        values.forEach((element, index) => {
                            cacheIdsQue[index].resolve(element);
                        });
                        this.clearQue();
                    })
                }
            });
        },
        clearQue() {
            this.cacheIdsQue = [];
        }
    }
    return loader;
}

// 测试
const loader = new Dataloader((ids) => {
    return Promise.resolve(ids.map(id => {
        return id + \'abc\';
    }));
});
loader.load(3).then(console.log)
loader.load(1).then(console.log)
loader.load(2).then(console.log)

以上是关于如何实现一个批量获取数据的dataloader,合并多个操作的主要内容,如果未能解决你的问题,请参考以下文章

如何从 DataLoader 获取样本的文件名?

Dataloader安装使用

如何使用 DataLoader 与 Hot Chocolate GraphQL 进行连接

PyTorch DataLoader 将批次作为列表返回,批次作为唯一条目。如何从我的 DataLoader 获取张量的最佳方式

如何使用 torch Dataloader 获取具有相同类的图片?

如何批量将多个txt文本中多行合并成一行,且中间用tab或空间间隔,并最终合并成一个txt文件