[英]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.