我是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();
}
到目前为止,如果尚未设置/加载属性,则getter将返回promise对象。我可以在调用函数中使用... then()来处理这个promise对象,但我希望getter保留返回值,直到promise已经解决。这甚至可能吗?
此致 格雷格
答案 0 :(得分:2)
您的界面可能只是总是返回一个承诺。然后调用者可以这样做:
data: { 'LookupID': lookupID, 'isMiscellaneous': IsMiscellaneous },
无论该属性以前是否被缓存,它们的界面都是相同的。
实际上,您甚至可以在内部使用promise作为缓存机制。
this.getProperty().then(...)
这样做的一个原因是,如果异步提取属性或已经缓存属性,则不希望调用者必须知道或做任何不同的事情。为两者提供相同接口的唯一方法是使接口始终保持异步,只需返回承诺即可自动生成。
仅供参考,在您展示的代码中,您使用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;
}
来记录错误,但不会重新抛出错误。这将“默默地”吃掉错误,并且不会返回给调用者。调用者将看到具有.catch()
值的履行承诺。如果您希望自己undefined
执行日志记录,则必须重新抛出错误(或返回被拒绝的承诺)以确保它传播回调用方。 .catch()
本身没有返回值只会将promise更改为已解决的promise,因为它假定您已经处理了错误。