2015-11-09 4 views
0

Я бы использовал обещания angularJS для заполнения данных в сетке. Я хотел бы загружать данные «подряд за строкой», как только сервер nodeJS, на котором используется модуль «mssql» с включенным «потоком», возвращает клиенту каждую отдельную строку из БД.угловые обещания и nodejs http получить ответ

На стороне клиента я использую эти функции:

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

Вы не можете сделать это с помощью классических HTTP-запросов, используя AngularJS Client. Вы можете захотеть использовать что-то вроде Socket.IO для отправки результатов по одному, поскольку они читаются – Don

+0

@ Jackpot21 Проверьте документы mssql для метода pipe. Это может быть так просто, как request.pipe (res) – Molda

ответ

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

Таким образом, как только один ряд считывается из БД, он немедленно отправляется клиенту :)

Смежные вопросы