簡體   English   中英

Node.js:如何編寫“異步” getter

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM