首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Knex.js非终止函数

Knex.js非终止函数
EN

Stack Overflow用户
提问于 2018-07-28 16:35:01
回答 2查看 118关注 0票数 0

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

在代码中,您可以编写如下所示的代码

代码语言:javascript
复制
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行开始?更重要的是,当我登录搜索时,它不是一个承诺,而是一种对象,那么它如何被等待呢?

有人能提供一个简单的例子来实现这样的行为吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-28 16:58:58

我猜search包含一个名为then的属性,它是一个启动搜索的函数,其行为也类似于Promise.prototype.then的功能。

例如:

代码语言:javascript
复制
// 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,就好像它是一个接受回调参数的函数一样。

票数 0
EN

Stack Overflow用户

发布于 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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51569565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档