Использование Promises для циклов JavaScrMipt nodeJS - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь использовать функцию 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);
        })
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...