Mysql node.js async, дождитесь завершения запроса - PullRequest
0 голосов
/ 04 ноября 2018

Старался все, чтобы это работало, в частности, асинхронный каждый метод. for (константный элемент resultsHistory) также не работает.

Я пытаюсь изменить массив результатов из предыдущего запроса, выполнив над ним foreach и выполнив запрос mysql.

Однако для этого нужно дождаться завершения запроса.

Есть ли способ получить доступ к этим результатам без setTimeout (function () {}, которую я поставил вручную, чтобы дождаться завершения запроса?

        function getUserLikes(params, callback) {
            var usersArrayCat = [];
            console.log(`length of array ${params.length}`)
                                // 1 here means 1 request at a time
            async.eachLimit(params, 1, function (element, cb) {
                element.liked = 0;
                var queryLiked = `SELECT * from users_likes WHERE user_id = \"${req.body.userid}\" AND product_id = \"${element.product_id}\"`;
                connectionPromise.query(queryLiked, function (err, result) {
                    if (!result) {
                    } else if (result.length == 0) {

                    } else {
                        element.liked = result[0].userlike;

                        usersArrayCat.push(element);
                      //  console.log(usersArrayCat);
                        cb();
                    }
                })
            }, function (err) {
                if (err) return callback(err);
                callback(null, usersArrayCat)
            });
        };

    getUserLikes(resultsHistory, function (e) {
    console.log(e);
       });     



        if(!res.headersSent) {

            setTimeout(function() {  

            res.send(JSON.stringify({"status": 200 ,"error": null, "top3":resultsHistory}));
            }, 150);


        }

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Удалось заставить это работать так, но все еще не уверен, что это правильный путь.

async function getUserLikes(resultsHistory) {
    for (const element of resultsHistory) {
        element.liked = 0;
        let queryLiked = `SELECT * from users_likes WHERE user_id = \"${req.body.userid}\" AND product_id = \"${element.product_id}\"`;
        let liked = await conn2.query(queryLiked);

        if (liked[0]) {
            element.liked = liked[0].userlike;
        }        
    }
    if(!res.headersSent) {
        conn2.release();     
        let newres = resultsHistory.sort(
            firstBy(function (v1, v2) { return v2.rating - v1.rating; })
             .thenBy(function (v1, v2) { return v2.dranktimes - v1.dranktimes; })
        ).filter( function(history) {             
            return history.event === eventName;
        }).slice(0, 3);

       res.send({"status": 200 ,"error": null, "top3":newres});       
    }
}

getUserLikes(resultsHistory);
0 голосов
/ 05 ноября 2018

Смотрите мой ответ:

function getUserLikes(params, callback) {
    var usersArrayCat = [];
    console.log(`length of array ${params.length}`)
    // 1 here means 1 request at a time
    async.eachLimit(params, 1, function (element, cb) {
        element.liked = 0;
        var queryLiked = `SELECT * from users_likes WHERE user_id = \"${req.body.userid}\" AND product_id = \"${element.product_id}\"`;
        connectionPromise.query(queryLiked, function (err, result) {
            if (!result) {
            } else if (result.length == 0) {

            } else {
                element.liked = result[0].userlike;

                usersArrayCat.push(element);
                //  console.log(usersArrayCat);

            }
            cb();
        })
    }, function (err) {
        if (err) return callback(err);
        callback(null, usersArrayCat)
    });
};

getUserLikes(resultsHistory, function (e, usersArrayCat) {
    if (e) {
        console.log(e);
        return res.send({status: 400, error: e}); // your error response
    }
    console.log(usersArrayCat); // your usersArrayCat with liked property
    res.send(JSON.stringify({ // why your need return a string intead of json object ???
        "status": 200,
        "error": null,
        "top3": usersArrayCat // I think return `usersArrayCat` is a right way
    }));
});
...