[英]Node.js: How do I write an “asynchronous” getter
我是Node.js的新手,所以如果我的问题听起来有些愚蠢,请您道歉。
这就是我要去的地方:
我正在设计一个必须通过数据库查询设置其属性的对象。 对于此任务,我需要promise-mysql 。 为了将属性提供给其他对象,我希望有一个getter来检查天气是否设置了该属性,在后者中,后者将在返回值之前从数据库加载该属性。
到目前为止,我的方法:
MyObject = function ()
{
this._property = null;
};
MyObject.prototype._loadProperty = function()
{
var self = this;
return pool.query('SELECT * FROM table WHERE condition = ?', [condition]).then(function(rows)
{
return self._property = rows;
}).catch(function(err)
{
console.log(err);
});
};
MyObject.prototype._getProperty = function()
{
return this._property || this._loadProperty();
}
到目前为止,如果尚未设置/加载属性,则吸气剂将返回promise对象。 我可以在调用函数中使用... then()处理这个Promise对象,但是我希望getter保留返回值,直到Promise完成。 这有可能吗?
问候格雷格
您的界面可能应该总是返回一个承诺。 然后,调用方可以执行以下操作:
this.getProperty().then(...)
无论该属性先前是否已缓存,它们的接口都是相同的。
实际上,您甚至可以在内部使用Promise作为缓存机制。
MyObject = function () {
this._propertyPromise = null;
};
MyObject.prototype._loadProperty = function () {
var self = this;
return pool.query('SELECT * FROM table WHERE condition = ?', [condition]).catch(function (err) {
console.log(err);
throw err; // propagate reject error back to caller
});
};
MyObject.prototype.getProperty = function () {
if (!this._propertyPromise) {
this._propertyPromise = this._loadProperty();
}
return this._propertyPromise;
}
这样做的原因是,如果属性是异步获取的或已经缓存的,则您不希望调用方知道或执行其他操作。 为两者提供相同接口的唯一方法是使接口始终保持异步状态,仅返回promise即可自动为您提供。
仅供参考,在您显示的代码中,您正在使用.catch()
记录错误,但没有重新抛出该错误。 这将“无声地”吞噬错误,并且不会将其返回给调用方。 呼叫者将改为看到带有undefined
值的已兑现承诺。 如果出于日志记录的原因想要执行自己的.catch()
,则必须重新抛出错误(或返回被拒绝的承诺)以确保其传播回调用者。 本身没有返回值的.catch()
只会将承诺更改为已解决的承诺,因为它假定您已处理了错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.