在这个问题上我没有任何问题,我只是对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行开始查询执行吗?而且,当我登录搜索时,它不是一个承诺,而是某种对象,那么如何等待它呢?
有人可以提供一个简单的示例来实现这种行为吗?
答案 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。