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

Node.js Wait for callback or database response

我见过很多非常相似的问题,但没有给出实际等待的直接答案。我有一个基于 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 关系和 return 计数。但在这种情况下,看起来 this.related('siteProductsReferences').fetch() 必须花一些时间才能 return 做出回应。 this.related('siteProductsReferences').fetch() 也有一个类似这样的承诺;

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

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

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

很明显回调还没有结束。

因为数据库操作 return 是一个承诺,你的函数也需要 return 一个承诺 - 没有办法摆脱它,你必须将承诺传递回调用者,这将需要.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() 承诺 returned 像这样:

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

就其价值而言,我认为您在构建数据的内存模型时可能走错了路。在处理来自数据库的数据时,这是面向对象的开发人员所青睐的一种技术,但我总是发现很难以一种优雅的方式进行这项工作——构建模型需要付出很多努力,而努力却没有。真的没有回报。