db クエリによってバックアップされる redis クエリの非同期ラッパーが必要です。redis クエリが失敗した場合は、db クエリを作成したいと考えています。db クエリが成功した場合、返されたデータを redis に追加してから返したいと考えています。この関数は node.js 内から呼び出されるため、Promise を返すには関数 (できればオブジェクトのそのようなメソッドの 1 つ) が必要です。ブルーバードの約束ライブラリを使用しており、それを使用してredisを約束しています。これもブルーバードベースのdbにmongo-gyroを使用しています。これらはどちらもスタンドアロンで動作します。
特に疑似コードでさえ、どんな助けも深く感謝しています。誤った取り扱いで
function get_something(key){
redis.get(key).done(function (res){
if (null !== res){
return res; // how do I return a promise here?
}
})
.done(function (res){
db.find({'_id:key'}).done(function (res){
if (null !== res){
redis.set(key,result) // set db value in redis
.then(function(){
return res; //how do I return a promise here?
})
.catch()...?
return res; // how do I return a promise here?
}
})
.catch...?
};
更新: 以下の関数が機能し、最後に redis または mongo からのデータが表示されます。ただし、これを node.js ハンドラーに返される promise を返すクラスのメソッドに変換することにこれまで成功していません。注意 - データのソースをキャプチャするために「バインド」を追加する必要がありました
var oid = '+++++ test oid ++++++'
var odata = {
'story': 'once upon a time'
}
var rkey = 'objects:'+ oid
redis.getAsync(rkey).bind(this).then(function(res){
if(res === null){
this.from = 'db' // we got from db
return db.findOne('objects',{'_id':oid})
}
data = JSON.parse(res)
this.from = 'redis' // we got from redis
return data
})
.then(function(res){
if(res !== null && this.from == 'db'){
data = JSON.stringify(res)
redis.setAsync(rkey,data)
}
return res
})
.then(function(res){ // at this point, res is not a promise
console.log('result from ' + this.from)
console.log(res)
});