是否可以实现异步版本的“modify”?Modify方法看起来不支持异步回调。我尝试覆盖查询构建器示例的“then”方法,在真实的的“then”方法之前运行我的异步代码。但是结果对象看起来与knex不完全兼容(例如clone方法似乎不起作用)
dbf7pr2w1#
Knex的modify函数用于同步合成:允许封装和重用查询片段和常见行为作为函数。回调函数应该接收查询构建器作为其第一个参数,然后是传递给修改的其余(可选)参数。使其通常异步有一个实际问题,也有一个语义问题。对于实际问题,如在您的示例中,callback.apply的返回值未被观察或返回:如果函数是async或者它返回一个Promise,就没有办法通知你它已经完成了。语义问题是顺序很重要(例如,当传递multiple orderBy clauses时)。假设由Knex产生的查询是同步可用的。也就是说,没有什么可以阻止您创建自己的modifyAsync函数,该函数具有与modify相同的语义,它等待传递的异步回调函数,然后返回一个解析为修改后的查询构建器的Promise。
modify
callback.apply
async
orderBy
modifyAsync
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; }
1条答案
按热度按时间dbf7pr2w1#
Knex的
modify
函数用于同步合成:允许封装和重用查询片段和常见行为作为函数。回调函数应该接收查询构建器作为其第一个参数,然后是传递给修改的其余(可选)参数。
使其通常异步有一个实际问题,也有一个语义问题。对于实际问题,如在您的示例中,
callback.apply
的返回值未被观察或返回:如果函数是async
或者它返回一个Promise,就没有办法通知你它已经完成了。语义问题是顺序很重要(例如,当传递multipleorderBy
clauses时)。假设由Knex产生的查询是同步可用的。也就是说,没有什么可以阻止您创建自己的
modifyAsync
函数,该函数具有与modify
相同的语义,它等待传递的异步回调函数,然后返回一个解析为修改后的查询构建器的Promise。