Node.js:如何编写"异步"吸气

时间:2016-02-04 23:31:14

标签: node.js asynchronous promise 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();
 }

到目前为止,如果尚未设置/加载属性,则getter将返回promise对象。我可以在调用函数中使用... then()来处理这个promise对象,但我希望getter保留返回值,直到promise已经解决。这甚至可能吗?

此致 格雷格

1 个答案:

答案 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,因为它假定您已经处理了错误。