我见过很多非常相似的问题,但没有给出实际等待的直接答案。我有一个基于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}
很明显,回调还没有结束。
答案 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
})
对于它的价值,我认为你可能会在构建内存数据模型时走错路。在处理来自数据库的数据时,这是面向对象的开发人员所青睐的技术,但我总是发现很难以优雅的方式完成这项工作 - 构建模型需要花费很多精力而且工作量不大。真的还清了。