2016-04-18 7 views
0

В моем Node.js приложения, чтение данных из MSSQL с помощью утомительно, я звоню ниже каждый 1 вторым:Javascript Promise(), то для предотвращения повторного вызова функции до первого вызова выполняются

  1. Извлечь данные с сервера (fetchStock) и сохранить их во временном массиве
  2. Отправлять данные, сохраненные во временном массиве, клиенту с использованием 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); 
    } 
} 
+0

почему вы хотите использовать перспективны для решения этой задачи? – Thomas

+0

Не нужно использовать обещание, я думал, что обещание может помочь, мне нужно только для предотвращения повторного запуска функции fetchStock до завершения предыдущего запуска. –

ответ

1

Я думаю, что вам нужно, это простая переменная, чтобы проверить, есть ли уже запущен запрос не Promise ,

var latch = false; 
// It will be called only if the previous call is completed 
var doFetchStock =() => sql.execSql(new Request("SQL", (err, rowCount, rows) => { 
    // Your logic dealing with result 

    // Initializes the latch 
    latch = false; 
}); 
module.exports = { 
    fetchStock: function() { 
    // Check if the previous request is completed or not 
    if (!latch) { 
     // Sets the latch 
     latch = true; 
     // Fetches stock 
     doFetchStock(); 
    } 
    } 
}; 

На самом деле я использовал этот тип шаблонов, чтобы позволить некоторое поведение только один раз.

+0

Спасибо @Donghwan –

0

Так как JavaScript является моно нарезкой простой код, как это должно быть достаточно на стороне клиента

function() { 
     if(currentPromise != null){ // define in a closure outside 
      currentPromise = [..] // call to server which return a promise 
      currentPromise.then(function(){ 
       currentPromise = null; 
      }); 
     } 
} 
+0

Не получилось, все это делается на стороне сервера, а сервер отправляет данные клиенту (-ам) через SSE, поэтому клиенту здесь нечего делать. –

+0

Итак, вы хотите заблокировать все клиентские запросы до тех пор, пока работает одна учетная запись? Javascriptis тоже монопоточен на стороне сервера, поэтому вы можете использовать трюк, как я. Однако я не знаю, как использовать переменную для разных запросов. – Walfrat

+0

Забудьте о клиентах, просто нужно, чтобы сервер не заново запускал его, прежде чем первая завершилась. –