2016-10-21 8 views
0

私はそう見える新しいJSONオブジェクトを作る機能が欲しい:Node.js&Redis&For Loop with bluebird約束?

{ T-ID_12 : [{ text: "aaaaa", kat:"a" }], T-ID_15 : [{ text: "b", kat:"ab" }], T-ID_16 : [{ text: "b", kat:"ab" }] } 

thesenjsondataこのT-ID_12でこの{ text: "aaaaa", kat:"a" }は、配列Thesen_IDSのエントリです。そして、これまでのところ、私の解決策は次のとおりです。

function makeThesenJSON(number_these, Thesen_IDS){ 
var thesenjsondata; 
var thesenids_with_jsondata = ""; 

for (i = 0; i < number_these; i++){ 

    db.getAsync(Thesen_IDS[i]).then(function(res) { 
     if(res){ 
      thesenjsondata = JSON.parse(res); 
      thesenids_with_jsondata += (Thesen_IDS[i] + ' : [ ' + thesenjsondata + " ], "); 

     } 

    }); 

} 

var Response = "{ " + thesenids_with_jsondata + " }" ; 
return Response; 
} 

私はforループがdb.getAsync(その後、高速であることを、知っています)。ブルーバードの約束を赤字で正しく使うことができるので、戻り値にはすべてのデータが含まれていますか?

答えて

2

Redis呼び出しから約束事の配列を作成し、BluebirdのPromise.allを使用して、すべてが配列として戻ってくるのを待つだけです。

function makeThesenJSON(number_these, Thesen_IDS) { 

    return Promise.all(number_these.map(function (n) { 
     return db.GetAsync(Thesen_IDS[n]); 
    })) 
    .then(function(arrayOfResults) { 
     var thesenids_with_jsondata = ""; 
     for (i = 0; i < arrayOfResults.length; i++) { 
     var res = arrayOfResults[i]; 
     var thesenjsondata = JSON.parse(res); 
     thesenids_with_jsondata += (Thesen_IDS[i] + ' : [ ' + thesenjsondata + " ], "); 
     } 
     return "{ " + thesenids_with_jsondata + " }"; 
    }) 
} 

この関数は、最終的に文字列に解決されるPromiseを返すため、この関数はどのように非同期であることに注意してください。だから、このようにそれを呼び出す:

makeThesenJSON.then(function (json) { 
    //do something with json 
}) 
+0

関数の戻り値は、今ある{ 「isFulfilled」:偽 「isRejected」:偽 } – Arzan0

+0

はそれが働いて、この関数に –

+0

THXの使用方法についての私の編集を参照してください。しかし、私は "var thesenjsondata = JSON.parse(res);" "var thesenjsondata = res;"に変更します。 – Arzan0