Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何通过模块中的变量正确存储共享数据_Node.js - Fatal编程技术网

Node.js 如何通过模块中的变量正确存储共享数据

Node.js 如何通过模块中的变量正确存储共享数据,node.js,Node.js,我的应用程序在数据库中有一些共享数据,而不是为每个请求读取它们,我只想将它们读取一次,并将它们作为数组存储在模块中。然而,我不知道如何正确地做到这一点,任何帮助都将不胜感激。谢谢 var isStored = false; var isStroing = false; var allRecords = []; function getSharedData(callback) { if (isStored) { callback(null, allRecords);

我的应用程序在数据库中有一些共享数据,而不是为每个请求读取它们,我只想将它们读取一次,并将它们作为数组存储在模块中。然而,我不知道如何正确地做到这一点,任何帮助都将不胜感激。谢谢

var isStored = false;
var isStroing = false;
var allRecords = [];

function getSharedData(callback) {
   if (isStored) {
      callback(null, allRecords);
      return;
   }
   if (isStoring) {  // check to see if other request is doing the storing now
      // IT HAS TO WAIT AND GET THE RESULT LATER, BUT NOT SURE HOW TO DO IT
   }
   isStoring = true;

   ......
   // invoke a function retrieve the data from database;
   // populate allRecords array and set isStored to true
   .....
}
经过深思熟虑,我的解决方案如下

var isStored = false;
var isStroing = false;
var allRecords = [];
var getSharedDataCallbacks = [];

function getSharedData(callback) {
   if (isStored) {
      callback();
      return;
   }

   getSharedDataCallbacks.push(callback);
   if (isStoring) {  
      return;
   }
   isStoring = true;

   // queryDatabase is not defined, basically, it retrieves
   // the data from database
   queryDatabase(function (error, result) {  
      var callbacks = getSharedDataCallbacks;
      getSharedDataCallbacks = [];
      isStroing = false;

      if (error) {
        callbacks.forEach(function (oneCallback) {
           oneCallback(error);
        }
        return;
      }
      allRecords = result; // assume result is an array 
      callbacks.forEach(function (oneCallback) {
          oneCallback();
      }
   });
}

function setSharedData(callback) {
    getSharedData.call(this, function (error) {
       if (error) {
          callback(error);
          return;
       }
       callback(null, allRecords);
    });
}

类似这样的事情可能会有所帮助:

var loaded = false;
var loading = false;
var allRecords = [];

function getSharedData(callback) {
   if (loaded) {
      return callback(null, allRecords);
   }
   if (loading) {
      return (loading[loading.legnth] = callback);
   }

   loading = [callback];

   return loadData(afterLoad); //loadData is your function to load data.


   function afterLoad(err, data) {
       //process and assign to allRecords
       var i = 0
       , loadingLen = loading.length
       ;
       for(i; i < loadingLen; i++) {
         (function(cb, data) {
           cb(null, data);
         })(loading[i], allRecords);
       }

       loading.length = 0;
       loaded = true;
   }
}
var-load=false;
var加载=假;
var-allRecords=[];
函数getSharedData(回调){
如果(已加载){
返回回调(null,allRecords);
}
如果(装载){
返回(加载[loading.legnth]=回调);
}
加载=[callback];
return loadData(afterLoad);//loadData是加载数据的函数。
功能后加载(错误、数据){
//处理并分配给所有记录
变量i=0
,loadingLen=loading.length
;
对于(i;i
希望有人能给出更详细的答案,但对于初学者来说,我认为在开始检索数据时使用Node随附的类发出事件,在检索完成时使用另一个类发出事件可能会有所帮助。听起来是个好主意,但不确定如何实现,我决定采用其他解决方案(见上文)。看起来不错。对于您在Node中的未来工作,我绝对建议您熟悉
EventEmitter
,因为许多核心类都使用它,而且事件通常比回调更灵活。您可以使用()方法。但这只是一个一般性的说明;很高兴您找到了解决方案。可以,谢谢Matt!