数据库操作的回调细微差别

时间:2017-05-22 13:31:52

标签: sql node.js callback

我是Node的新手,显然正在努力应对回调概念。如何在查询完成后才返回数组?我已经看到类似的节点与mssql模块示例,但我没有解决我的问题

function myFunction () {
    var arr = [];
    var connection = new sql.Connection(dbConfig, function (err) {
        var request = new sql.Request(connection);

        request.query('select top 10 Name from User', function (err, recordset) {
            if (err) {
                console.log('error');
            }

            for (var id in recordset) {
                arr.push(recordset[id]["Name"]);
            }
          
        });

    });
};

myFunction ();

最终,我想以数组或JSON格式“返回”结果集,以便我可以更轻松地使用它。

1 个答案:

答案 0 :(得分:0)

在Node中,您可以返回的两种主要(但不仅仅是!)方式。来自异步函数的是:

回调

request.query如何将回调作为参数类似,您也可以这样做:

function myFunction(cb) {
    var arr = [];
    var connection = new sql.Connection(dbConfig, function (err) {
        var request = new sql.Request(connection);

        request.query('select top 10 Name from User', function (err, recordset) {
            if (err) {
                console.log('error');
                cb(err, null);
                return;
            }

            for (var id in recordset) {
                arr.push(recordset[id]["Name"]);
            }

            cb(null, arr);
        });

    });
};

请注意我是如何遵循与其他Node回调相同的约定 - 将错误作为第一个参数,将返回的数据作为第二个参数。有了这个,你就可以使用你的功能:

myFunction(function (err, data) {
    if (err) {
        /* error handling */
    }

    /* do stuff with data here */
});

承诺

围绕异步的一个更现代的抽象是Promises - 这些表示将作为对象发生的异步事件,它将被解析或拒绝。以下是如何将此模式应用于您的函数:

function myFunction() {
    return new Promise(function (resolve, reject) {
       var arr = [];
       var connection = new sql.Connection(dbConfig, function (err) {
           var request = new sql.Request(connection);

           request.query('select top 10 Name from User', function (err, recordset) {
               if (err) {
                    console.log('error');
                    reject(err);
                    return;
               }

               for (var id in recordset) {
                   arr.push(recordset[id]["Name"]);
               }

               resolve(arr);
           });
        });
    });
};

然后,您可以将.then.catch链接到返回的Promise上以处理结果:

myFunction()
    .then(function (data) {
        /* ... */
    })
    .catch(function (err) {
        /* ... */
    });

这两个例子都非常基础 - 你可以做更多的事情,特别是在谈到Promises时(非常适合将大量异步内容链接在一起)。我鼓励您进一步研究这两种选择。