javascript 是否可以实现Knex“modify”的异步版本?

pjngdqdw  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(123)

是否可以实现异步版本的“modify”?
Modify方法看起来不支持异步回调。
我尝试覆盖查询构建器示例的“then”方法,
在真实的的“then”方法之前运行我的异步代码。但是结果对象看起来与knex不完全兼容(例如clone方法似乎不起作用)

dbf7pr2w

dbf7pr2w1#

Knex的modify函数用于同步合成:
允许封装和重用查询片段和常见行为作为函数。回调函数应该接收查询构建器作为其第一个参数,然后是传递给修改的其余(可选)参数。
使其通常异步有一个实际问题,也有一个语义问题。对于实际问题,如在您的示例中,callback.apply的返回值未被观察或返回:如果函数是async或者它返回一个Promise,就没有办法通知你它已经完成了。语义问题是顺序很重要(例如,当传递multiple orderBy clauses时)。假设由Knex产生的查询是同步可用的。
也就是说,没有什么可以阻止您创建自己的modifyAsync函数,该函数具有与modify相同的语义,它等待传递的异步回调函数,然后返回一个解析为修改后的查询构建器的Promise。

async function modifyAsync(queryBuilder, asyncCallback, ...args) {
  await asyncCallback.call(queryBuilder, queryBuilder, ...args);
  return queryBuilder;
}

async function createQuery() {
  let builder = knex.table(yourTable)
    /* ... */;
  builder = await modifyAsync(builder, yourAsyncModifyFunction, 'foo', 'bar');
  return builder;
}

相关问题