Knex.js非终止函数

时间:2018-07-28 08:35:01

标签: javascript promise async-await knex.js

在这个问题上我没有任何问题,我只是对knex.js如何处理某些事情感兴趣。

在代码中,您可以编写如下内容

let search = knex.table('users').select('something')
if(params.minprice) search.where('minprice', params.minprice)
if(something) search.something()
let result = await search

它有效,但是我不知道他们如何管理查询执行直到发生等待?如果我们等待,那意味着功能是异步的,也返回了一个承诺。但是在javascript中,promise会在调用返回的函数后立即执行,它不在乎.then()或.catch()。不应该从第1行开始查询执行吗?而且,当我登录搜索时,它不是一个承诺,而是某种对象,那么如何等待它呢?

有人可以提供一个简单的示例来实现这种行为吗?

2 个答案:

答案 0 :(得分:0)

我猜测search包含一个名为then的属性,该属性可以启动搜索,并且其行为类似于Promise.prototype.then的功能。

例如:

// define Searchable
let Searchable = function() {
  this.searchParam = 'param';
};
Searchable.prototype = {
  setSearchParam: function(p) { this.searchParam = p; },
  initiateSearch: async function() {
    // lots of fancy searching
    console.log(`Searching with param "${this.searchParam}"`);
    return `search based on "${this.searchParam}"`;
  },
  then: async function(callback) {
    // initiate the search:
    let searchResults = await this.initiateSearch();
    
    // behave kind of like `Promise.prototype.then`!
    return callback(searchResults);
  }
};

// now work with it:
(async () => {
  
  let searchable = new Searchable();
  searchable.setSearchParam('mySearchParam');
  
  console.log('No search performed yet!');
  
  // Here's the fancy usage you're concerned with (it invokes `searchable.then`):
  let searchResult = await searchable; 

  console.log('RESULT:', searchResult);
  
})();

在某些await上调用value会尝试调用value.then,就好像它是一个接受回调参数的函数一样。

答案 1 :(得分:0)

Knex查询构建器是可变的,并且是thenable对象。

因此,每次您为该查询生成器调用例如search.where(...)时,其内部状态都会更改并存储该新的where子句。

查询生成器可以支持,意味着该对象具有.then()方法,当您调用await search时,它实际上与await Promise.resolve(search)等效,后者首先执行thenable并将其转换承诺然后解决,否则可能会发生异常。

Thenable对象实际上是Promise规范中非常重要的部分,可在Promise和非Promise对象之间提供互操作性API。