Node.js等待callback或数据库响应

我看到很多非常类似的问题,但是并没有直接回答真正的等待。 我有一个基于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) { // ... }); 

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

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

所以显然这个callback还没有完成。

       

网上收集的解决方案 "Node.js等待callback或数据库响应"

因为数据库操作返回一个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; } 

客户需要。然后()承诺返回像这样:

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

对于我认为您可能正在构build数据的内存模型的错误path,这是值得的。 这是面向对象的开发人员在处理数据库数据时所喜欢的一种技术,但是我总是很难以优雅的方式来完成这项工作 – 构build模型需要付出很大的努力,真的还清