我在这个问题上没有任何问题,我只是对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行开始?更重要的是,当我登录搜索时,它不是一个承诺,而是一种对象,那么它如何被等待呢?
有人能提供一个简单的例子来实现这样的行为吗?
发布于 2018-07-28 16:58:58
我猜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);
})();
在某些value上调用await会尝试调用value.then,就好像它是一个接受回调参数的函数一样。
发布于 2018-08-03 16:34:09
Knex查询构建器是可变的和thenable对象。
因此,每次为查询构建器调用search.where(...)时,它的内部状态都会更改并存储新的where子句。
查询构建器是启用的,这意味着对象有.then()方法,当你调用await search时,它实际上相当于await Promise.resolve(search),它首先执行thenable并将其转换为promise,然后进行解析,否则可能会发生异常。
Thenable对象实际上是promise规范中非常重要的部分,它提供了promise和非promise对象之间的互操作性API。
https://stackoverflow.com/questions/51569565
复制相似问题