角度承诺和nodejs http得到响应

时间:2015-11-09 08:44:53

标签: javascript angularjs node.js promise

我会使用angularJS的承诺将数据填充到网格中。我想逐行加载数据""一旦nodeJS的服务器,使用模块" mssql"使用" stream"启用后,从DB返回客户端的每一行。

在客户端,我使用以下功能:

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');
    });
});

});

任何人都可以帮我这个吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我使用socket.io完成了它:)

在angularJS方面:

// count the row for test only
$scope.count = 0;
  $scope.prova = function () {
    mySocket.emit('getTableByRow', {});
    mySocket.on('resRow', function (data) {
      if (data.event == 'ROW') {
        $scope.count += 1;
      }else {
        $scope.count += " !!DONE!! ";
      }
   });
};

在NodeJS方面:

[ ... connection with DB ... ]

io.on('connection', function (socket) {
  socket.on('getTableByRow', function (data) {
      _getTableByRow(socket, data);
  });
});

_getTableByRow函数:

var _getTableByRow = function (socket, data) {
  var _query = 'select top 50 * from tb_test';
  request.query(_query);

  request.on('row', function(row) {
    // return only the ids for test 
    socket.emit('resRow', {event: 'ROW', data: row.id.toString()});
  });

  request.on('done', function(returnValue) {
    socket.emit('resRow', {event: 'DONE'});
  });

  request.on('recordset', function(columns) {
    console.log(columns);
  });

  request.on('error', function(err) {
    socket.emit('resRow', {event: 'ERROR', data: err});
  });
}

这样,只要从数据库中读取一行,就会立即将其发送到客户端:)