Node.js等待回调或数据库响应

时间:2017-08-31 03:45:43

标签: javascript node.js bookshelf.js

我见过很多非常相似的问题,但没有给出实际等待的直接答案。我有一个基于Bookshelf.js的脚本;

var Product = bookshelf.Model.extend({
  tableName: 'amazon_products',
  hasTimestamps: true,
  virtuals: { //https://github.com/bookshelf/bookshelf/wiki/Plugin:-Virtuals
    hasSiteProduct: function() {
      var product_references = this.related('siteProductsReferences').fetch()
      return product_references.length;
    }
  }

});

我已经设置了一个虚拟属性,它将简单地计算模型的OneToMany关系并返回计数。但在这种情况下,看起来this.related('siteProductsReferences').fetch()必须在返回响应之前花一些时间。 this.related('siteProductsReferences').fetch()也有一个看起来像这样的承诺;

this.related('siteProductsReferences').fetch().then(function(result) {
  // ...
});

我正在构建这个以通过API返回。如果我只是在方法中添加return this.related('siteProductsReferences').fetch(),我会得到一个完整的l get;

,"hasSiteProduct":{"isFulfilled":false,"isRejected":false}

很明显,回调还没有结束。

1 个答案:

答案 0 :(得分:1)

因为数据库操作返回一个promise,你的函数也需要返回一个promise - 没有任何结果,你必须将promise传递给需要.then()它的调用者。

下面不起作用,因为你无法访问尚未完成的承诺的.length:

hasSiteProduct: function() {
    var product_references = this.related('siteProductsReferences').fetch()
    return product_references.length;
}

但是你可以这样做:

hasSiteProduct: function() {
    var product_references_length_promise = 
    this.related('siteProductsReferences').fetch()
    .then(product_references => {
        return product_references.length;
    })

    // return the promise - it has not completed yet, client must .then() it
    return product_references_length_promise; 
}

客户端需要.then()返回的承诺如下:

hasSiteProduct().then(num_product_references => {
    // do something with num_product_references 
})

对于它的价值,我认为你可能会在构建内存数据模型时走错路。在处理来自数据库的数据时,这是面向对象的开发人员所青睐的技术,但我总是发现很难以优雅的方式完成这项工作 - 构建模型需要花费很多精力而且工作量不大。真的还清了。