Я пытаюсь использовать функцию Promise для циклов for, но получаю пустые значения, мне удалось решить проблему с Promise.ALL, и она работает с моими тремя объектами, но мне нужно написать функциюс более чем 50 объектами, и это решение кажется неправильным.
совет?спасибо.
Функция Promise
function getPOIbyID(id) {
return new Promise(function (resolve, reject) {
DButilsAzure.execQuery("select * from POI where ID='" + id + "'").then(function (responsePOI) {
let poi = responsePOI[0];
return DButilsAzure.execQuery("select Rank, body, Date from ReviewsPoi where POIid=" + id + " order by Date desc").then(function (responseREV) {
let rev = responseREV;
let lastTwo = [];
for (let i = 0; (i < responseREV.length && i < 2); i++) {
lastTwo[i] = responseREV[i];
}
let returnPOI = {
"Name": poi.Name,
"Description": poi.Description,
"Rank": poi.Rank,
"UsersWatching": poi.UserWaching,
"Picture": poi.Picture,
"Reviews": lastTwo
}
resolve(returnPOI);
}).catch(function (err) {console.log (err) })
}).catch(function (err) { console.log (err)})
});
}
исходный код:
router.get('/Random3', function (req, res) {
DButilsAzure.execQuery("select ID from POI").then(function (responseID) {
let retArr = [];
for (let i=0; i<3; i++) {
let tmpID = Math.floor(Math.random() * (responseID.length));
getPOIbyID(responseID[tmpID].ID).then(function (responsePOI) {
retArr[i] = responsePOI;
if (i === 2)
res.json(retArr);
}).catch(function (err) { console.log (err)})
}
})
})
решение:
router.get('/Random3', function (req, res) {
DButilsAzure.execQuery("select ID from POI").then(function (responseID) {
let retArr = [];
let usedrans=[];
let count=0;
var promise1=new Promise(function(resolve,reject) {
let tmpID = Math.floor(Math.random() * (responseID.length));
while(usedrans.includes(tmpID))
tmpID = Math.floor(Math.random() * (responseID.length));
usedrans[count]=tmpID;
count++
resolve(getPOIbyID(responseID[tmpID].ID))
})
var promise2=new Promise(function(resolve,reject) {
let tmpID = Math.floor(Math.random() * (responseID.length));
while(usedrans.includes(tmpID))
tmpID = Math.floor(Math.random() * (responseID.length));
usedrans[count]=tmpID;
count++
resolve(getPOIbyID(responseID[tmpID].ID))
})
var promise3=new Promise(function(resolve,reject) {
let tmpID = Math.floor(Math.random() * (responseID.length));
while(usedrans.includes(tmpID))
tmpID = Math.floor(Math.random() * (responseID.length));
usedrans[count]=tmpID;
count++
resolve(getPOIbyID(responseID[tmpID].ID))
})
Promise.all([promise1,promise2,promise3]).then(function(values){
res.send(values);
})
})