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
})
就其价值而言,我认为您在构建数据的内存模型时可能走错了路。在处理来自数据库的数据时,这是面向对象的开发人员所青睐的一种技术,但我总是发现很难以一种优雅的方式进行这项工作——构建模型需要付出很多努力,而努力却没有。真的没有回报。
我见过很多非常相似的问题,但没有给出实际等待的直接答案。我有一个基于 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
})
就其价值而言,我认为您在构建数据的内存模型时可能走错了路。在处理来自数据库的数据时,这是面向对象的开发人员所青睐的一种技术,但我总是发现很难以一种优雅的方式进行这项工作——构建模型需要付出很多努力,而努力却没有。真的没有回报。