创建 knex queryBuilder 并稍后执行 [英] create knex queryBuilder and execute later

查看:35
本文介绍了创建 knex queryBuilder 并稍后执行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望创建一个 queryBuilder 对象,并推迟执行直到我准备好了.下面的代码允许我在不执行查询的情况下在函数之间传递一个 queryBuilder 对象.

I'm hoping to create a queryBuilder object, and defer execution until I'm ready. The following code allows me to pass a queryBuilder object between functions without executing the query.

const getQueryBuilder = () => 
    knex({ client: "mysql2" }).queryBuilder();

const getBaseSelect = () =>
    getQueryBuilder().select().from('foo');

const getOne = () =>
   getBaseSelect().limit(1);

console.log(getBaseSelect()); // select * from `foo`
console.log(getOne());        // select * from `foo` limit 1

我的问题是如何执行我在 queryBuilder 中构建的查询?

My question is how do I then execute the query that I've constructed in the queryBuilder?

或者有没有更好的方法在执行之前从多个同步函数构造查询?

Or is there a better way to construct queries from multiple synchronous functions before executing?

谢谢.

推荐答案

你想推迟执行",直到你准备好".

You want to 'defer execution until' you are 'ready.'

这取决于您所说的就绪"是什么意思,但您可以在所需操作完成时使用 Promise 触发查询.

It will depend on what you mean by 'ready', but you can fire the query when the desired action is finished using Promise.

例如,如果您想在 5 秒延迟后执行查询,请使用 MDN Promise 文档,你可以这样做:

For example, if you want to execute the query after 5 seconds delay, using the example from MDN Promise doc, you can do something like this:

let myFirstPromise = new Promise((resolve, reject) => {
  // We call resolve(...) when what we were doing asynchronously was successful, and reject(...) when it failed.
  // In this example, we use setTimeout(...) to simulate async code.
  // In reality, you will probably be using something like XHR or an HTML5 API.
  setTimeout(function(){
    resolve("After this value is resolved with 5000ms delay, "); // Yay! Everything went well!
  }, 5000);
});

myFirstPromise.then((successMessage) => {
  // successMessage is whatever we passed in the resolve(...) function above.
  // It doesn't have to be a string, but if it is only a succeed message, it probably will be.
  // You can fire your query here
  console.log(successMessage + "you can execute your query inside this then(..) function!");
  // execute(getBaseSelect());
});

如果你正在等待多个 Promise,你可以像这样使用 Promise.all(..):

If you are waiting on multiple promises, you can use Promise.all(..) like this:

Promise.all([myFirstPromise, mySecondPromise, myThirdPromise])
  .then((values) => {
    return execute(values[0], values[1], values[2])
  });

这篇关于创建 knex queryBuilder 并稍后执行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆