一度データをロードして、そのデータへのインターフェースを提供するいくつかのモジュールを作成する必要があります。データを非同期にロードしたいのですが。私のアプリケーションはすでにpromiseを使用しています。モジュールを要求した結果として約束を提供することは有効なパターン/イディオムですか?
モジュールの例:
var DB = require('promise-based-db-module');
module.exports =
DB.fetch('foo')
.then(function(foo){
return {
getId: function(){return foo.id;},
getName: function(){return foo.name;}
};
});
使用例:
require('./myPromiseModule')
.then(function(dataInterface){
// Use the data
});
更新:
私はこれをしばらく使用してきましたが、うまくいきます。私が学んだことと、受け入れられた回答で示唆されていることの1つは、promise自体をキャッシュすること、およびデータにアクセスする場合は常にthen
を使用することをお勧めします。データが初めてアクセスされるとき、コードはpromiseが解決されるまで待機します。 then
を続けて使用すると、データがすぐに返されます。例えば.
var cachedPromise = require('./myPromiseModule');
cachedPromise.then(function(dataInterface){
// Use the data
});
...
cachedPromise.then(function(dataInterface){
// Use the data again somewhere else.
});
これは、一部のデータの1回限りのフェッチを実行するモジュールの完璧なインターフェイスのようです。
データは非同期に取得されるので、そのための約束は意味があります。目標は、データを一度だけフェッチしてから、このモジュールが使用されるすべての場所に、元のデータへのアクセス権を与えることです。それはその状態を記憶するワンショットデバイスであるため、promiseもそのためにうまく機能します。
個人的には、プロパティへの直接アクセスを提供するだけでどちらでも機能するのに、getId()
およびgetName()
メソッドが必要な理由がわかりません。
このインターフェースの欠点は、データの新しいコピー(DBから新しく読み込まれたもの)を要求する手段がないことです。