NodeJs - как мне вернуть ответ со списком сообщений после завершения цикла for - PullRequest
0 голосов
/ 27 сентября 2018

Я использую nodejs.

Как я могу убедиться, что мой цикл for полностью завершил работу, чтобы я мог вернуть свой msgList, заполненный записями, из которых один проход / неудача?

Есть ли правильный способ, еслииспользуя обратный вызов или обещание для этого случая?

Сейчас я получаю следующее:

Результат:

{
    "message": "Handling PUT requests to /api/micontact.",
    "result": []
}

Код:

exports.updateBooks = (req, res) => {       

    var books = req.body.books;

    var createdBy = constant.defaultUsername;
    var currentDate = converter.formatDate(new Date());

    let msgList = [];

    for (var i = 0; i < books.length; i++) {

        let msgArr = "Record index: " + i + " ";

        var params = [];

        var book = books[i];

        var bookId = globUtil.checkforUndefined(book.bookId);
        var title = globUtil.checkforUndefined(book.title);

        if(bookId === null) {
            msgArr += message.bookId ;
            msgList.push(msgArr)
        }


        params.push(title, bookId);

        pool.open(connString, function (err, db) {
            if (err) {

                msgArr += err;
                msgList.push(msgArr);

                return;
            }

            db.query(query.sqlUpdate, params, function (error, result, info) {

                if (error) {

                    msgArr += error;
                    msgList.push(msgArr);

                    return;
                }

                msgArr += "SUCCESS";
                msgList.push(msgArr);
            });

            db.close();
        });
    }

    res.status(200).json({
        message: format(message.defaultMsg, "PUT", constant.moduleUrl),
        result: msgList 
    });
};

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Это происходит из-за того, что NodeJS работает асинхронно и обменивается данными с помощью обратных вызовов, вы можете использовать следующий способ для достижения ваших требований:

exports.updateBooks = (req, res) => {       

    var books = req.body.books;

    var createdBy = constant.defaultUsername;
    var currentDate = converter.formatDate(new Date());

    let msgList = [];

    for (var i = 0; i < books.length; i++) {

        let msgArr = "Record index: " + i + " ";

        var params = [];

        var book = books[i];

        var bookId = globUtil.checkforUndefined(book.bookId);
        var title = globUtil.checkforUndefined(book.title);

        if(bookId === null) {
            msgArr += message.bookId ;
            msgList.push(msgArr)
        }


        params.push(title, bookId);

        pool.open(connString, function (err, db) {
            if (err) {

                msgArr += err;
                msgList.push(msgArr);

                return;
            }

            db.query(query.sqlUpdate, params, function (error, result, info) {

                if (error) {

                    msgArr += error;
                    msgList.push(msgArr);

                    return;
                }

                msgArr += "SUCCESS";
                msgList.push(msgArr);

res.status(200).json({
        message: format(message.defaultMsg, "PUT", constant.moduleUrl),
        result: msgList 
    });
            });

            db.close();
        });
    }


};
0 голосов
/ 27 сентября 2018

Вы можете использовать обещание следующим образом, внести соответствующие изменения в свой код.Подробнее об обещании ссылка

var fetchData = function () {
    return new Promise(function (resolve, reject) {
        pool.open(connString, function (err, db) {
                if (err) {
                   reject();
                }

            db.query(query.sqlUpdate, params, function (error, result, info) {
                if (error) {
                    reject();
                }

                resolve();
            });
            db.close();
        });
    });
};

exports.updateBooks = (req, res) => {       
...

    var count = 0;
    for (var i = 0; i < books.length; i++) {
        fetchData(i).then(function(result){
            count+=1;
            if(count == books.length){
                //send response
                res.status(200).json({
                 message:format(message.defaultMsg,"PUT",constant.moduleUrl),
                result: msgList 
                });
            }
        }).catch(function(err){
            //send error
        })
    }
};
...