我想要一个生成新的json对象的函数,它看起来是这样的:
{ T-ID_12 : [{ text: "aaaaa", kat:"a" }], T-ID_15 : [{ text: "b", kat:"ab" }], T-ID_16 : [{ text: "b", kat:"ab" }] }
这个
{ text: "aaaaa", kat:"a" }
在sensondata中,这个T-ID_12
是sen id数组的一个条目。到目前为止,我的解决方案是: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()更快。如何使用redis右边的bluebird promises,使返回值拥有我想要的所有数据?
最佳答案
你只需要从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 + " }";
})
}
注意这个函数是如何异步的,因为它返回一个最终将解析为字符串的承诺。所以你这样称呼它:
makeThesenJSON.then(function (json) {
//do something with json
})
关于node.js - Node.js和Redis&For Loop与 Bluebird 的 promise ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40184264/