NodeJ-在for循环完成后如何返回带有msg列表的响应

时间:2018-09-27 03:12:57

标签: node.js asynchronous callback promise

我正在使用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 :(得分:0)

您可以按照以下方式使用promise,对您的代码进行适当的更改。有关承诺link

的更多信息
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
        })
    }
};

答案 1 :(得分:0)

发生这种情况是因为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();
        });
    }


};