В моем Node.js приложения, чтение данных из MSSQL с помощью утомительно, я звоню ниже каждый 1 вторым:Javascript Promise(), то для предотвращения повторного вызова функции до первого вызова выполняются
- Извлечь данные с сервера (
fetchStock
) и сохранить их во временном массиве - Отправлять данные, сохраненные во временном массиве, клиенту с использованием API-сообщений, передаваемых сервером (SSE).
Похоже, 1 секунда недостаточно, чтобы вызвать функцию fetchStock
до того, как предыдущий вызов будет полностью выполнен, поэтому время от времени я получаю ошибки выполнения. Я увеличил его до 5 секунд, но все равно получаю одну и ту же проблему каждый раз в то время.
Как я могу использовать Promise().then
, чтобы убедиться, что функция fetchStock
не переименована до того, как вызов полностью будет выполнен?
var Request = require('tedious').Request;
var Connection = require('tedious').Connection;
var config = {
userName: 'sa',
password: 'pswd',
server: 'xx.xxx.xx.xxx',
options: {
database: 'DB',
rowCollectionOnRequestCompletion: 'true',
rowCollectionOnDone: 'true'
},
};
var sql = new Connection(config);
var addElem = (obj, elem)=> [].push.call(obj, elem);
var result = {}, tmpCol = {}, tmpRow = {};
module.exports = {
displayStock: function (es) {
var dloop = setInterval(function() {
if(result.error !== null)
if (es) es.send(JSON.stringify(result), {event: 'rmSoH', id: (new Date()).toLocaleTimeString()});
if(result.error === null)
if (es) es.send('connection is closed');
}, 1000);
},
fetchStock: function() {
request = new Request("SELECT ItemCode, WhsCode, OnHand FROM OITW where OnHand > 0 and (WhsCode ='RM' or WhsCode ='FG');", function(err, rowCount, rows) {
if (err) {
result = {'error': err};
console.log((new Date()).toLocaleTimeString()+' err : '+err);
}
if(rows)
rows.forEach(function(row){
row.forEach(function(column){
var colName = column.metadata.colName;
var value = column.value;
addElem(tmpCol, {colName: value})
});
addElem(tmpRow,{'item': tmpCol[0].colName, 'Whs': tmpCol[1].colName, 'Qty': tmpCol[2].colName});
tmpCol = {};
});
result = tmpRow;
tmpRow={}
});
sql.execSql(request);
}
}
почему вы хотите использовать перспективны для решения этой задачи? – Thomas
Не нужно использовать обещание, я думал, что обещание может помочь, мне нужно только для предотвращения повторного запуска функции fetchStock до завершения предыдущего запуска. –