【发布时间】:2015-11-09 17:49:27
【问题描述】:
我会使用 angularJS 的承诺将数据填充到网格中。我想在nodeJS的服务器上“逐行”加载数据,在该服务器上使用启用了“流”的模块“mssql”,从数据库中的每一行返回到客户端。
在客户端我使用这些函数:
function asyncGreet() {
var deferred = $q.defer();
var _url = 'http://localhost:1212/test';
$http.get(_url).
then(function(result) {
deferred.resolve(result);
}, function(error) {
deferred.reject(error);
}, function(value) {
deferred.notify(value); //<<-- In "value" I would like to get every single row
});
return deferred.promise;
}
$scope.btnTest = function () {
var promise = asyncGreet();
promise.then(function(res) {
console.log('Success: ' + res.data + "\n");
}, function(reason) {
console.log('Failed: ' + reason);
}, function(update) {
console.log('Got notification: ' + update); //<<--
});
};
在 nodeJS 服务器上:
app.get('/test', function (req, res) {
//sql for test
var _query = 'select top 50 * from tb_test';
var sql = require('mssql');
var connection;
var config = {
user: 'testUser',
password: '12345',
server: 'localhost\\test',
database: 'testDB',
stream: true
};
connection = new sql.Connection(config, function (err) {
var request = new sql.Request(connection);
request.query(_query);
request.on('recordset', function(columns) {
// Emitted once for each recordset in a query
//res.send(columns);
});
request.on('row', function(row) {
res.write(JSON.stringify(row)); //<<-- I would like intercept this event on client side
// and get the result in my angularJS function on deferred.notify
});
request.on('error', function(err) {
// May be emitted multiple times
console.error(err)
});
request.on('done', function(returnValue) {
// Always emitted as the last one
res.end('DONE');
});
});
});
有人可以帮我吗?
谢谢!
【问题讨论】:
-
您不能使用 AngularJS 客户端对经典的 HTTP 请求执行此操作。您可能想看看使用 Socket.IO 之类的东西将结果一一发送,因为它们被读取
-
@Jackpot21 检查 mssql 的文档以了解管道方法。它可能像 request.pipe(res) 一样简单
标签: javascript angularjs node.js promise