【问题标题】:Knex.js non-terminating functionsKnex.js 非终止函数
【发布时间】:2018-07-28 08:35:00
【问题描述】:

我对这个问题没有任何问题,我只是对 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

它有效,但我不明白他们是如何在等待发生之前保持查询执行的?如果我们确实等待,这意味着函数是异步的,也就是返回了一个 Promise。但是在 javascript 中,一旦调用返回它的函数,promise 就会执行,它不在乎是 .then() 还是 .catch()。不应该从第 1 行开始查询执行吗?更何况,我log search的时候,不是promise,而是某种object,怎么可能等待呢?

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

【问题讨论】:

    标签: javascript promise async-await knex.js


    【解决方案1】:

    我猜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,就好像它是一个接受回调参数的函数。

    【讨论】:

    • 感谢您的回答。我永远不会想出那个。这真的让我笑了。
    【解决方案2】:

    Knex 查询生成器是可变的和thenable 对象。

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

    查询生成器可调用意味着该对象具有.then() 方法,当您调用await search 它实际上与await Promise.resolve(search) 非常等价,await Promise.resolve(search) 首先执行thenable 并将其转换为promise,然后再解析或可能会出现异常。

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

    【讨论】:

      猜你喜欢
      • 2016-09-08
      • 2014-04-07
      • 2021-06-01
      • 2017-12-01
      • 2014-03-16
      • 2017-11-18
      • 1970-01-01
      • 2020-09-15
      • 2011-01-08
      相关资源
      最近更新 更多