Node.js

#node.js #for-loop #redis #promise #bluebird

#node.js #цикл for #redis #обещание #bluebird

Вопрос:

я хочу функцию, которая создает новый объект 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" } в thesenjsondata, и это T-ID_12 является записью массива 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(). Как я могу правильно использовать обещания bluebird с redis, чтобы возвращаемое значение содержало все нужные мне данные?

Ответ №1:

Вы просто создаете массив обещаний из вызовов 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
})
  

Комментарии:

1. теперь функция возвращает { «isFulfilled»: false «isRejected»: false}

2. спасибо, это работает, но мне пришлось изменить «var thesenjsondata = JSON.parse(res);» на «var thesenjsondata = res;»

3. Рад, что смог помочь!