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还没有完成。
因为数据库操作返回一个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模型需要付出很大的努力,真的还清