2017-06-21 49 views
2

我有一个基于用户日期范围的搜索功能。有时我会看到服务器的结果,在某些情况下,它会返回空响​​应数组matches一旦处理完成,如何在异步nodejs中使用回调清除数组?

我们如何确保async.eachSeries()已完成并将结果发送到客户端并清除下一个搜索的数组?我试图申请setTimeout但这并没有解决问题。

search.js

var matches; 
var results = []; 


// loop through each file 
async.eachSeries(filesData.logFiles, function(logfile, done) { 
    // read file 
    readStream = fs.createReadStream('./logs/' + filesData.searchEnv + '/' + logfile.filename, 'utf8') 
    readStream.pipe(split()) 
     .on('data', function(line) { 
      if (typeof searchStr === 'string') { 
       multipleStrFlag = false; 
       if (messageDateInfo - searchStartDate > 0 && searchEndDate - messageDateInfo > 0) { 
        results.push({ 
         filename: logfile.filename, 
         value: line 
        }); 

       } 
      } else { 
       multipleStrFlag = true; 
       if (messageDateInfo - searchStartDate > 0 && searchEndDate - messageDateInfo > 0) { 
        results.push({ 
         filename: logfile.filename, 
         value: line 
        }); 

       } 

      }; 
     }); 
    done(); 
}, function(err) { 
    if (err) { 
     console.log('error', err); 
    } 
}); 

readStream.on('end', function() { 
    if (multipleStrFlag) { 
     var matchingCondition = function matchingCondition(_ref) { 
      var itemB = _ref.itemB, 
       itemA = _ref.itemA; 
      return itemB.value.includes(itemA); 
     }; 
     // filter all items from B that satisfy a matching condition with at least one item from A 
     matches = results.filter(function(itemB) { 
      return searchStr.every(function(itemA) { 
       return matchingCondition({ 
        itemB: itemB, 
        itemA: itemA 
       }); 
      }); 
     }); 
    } else { 
     matches = results; 
    } 
    setTimeout(function,(){ 
    callback(matches); 
    matches = []; 
    results = []; 
    },1000); 
}); 

回答

0

异步提供以下语法。

eachSeries(coll, iteratee, callback) 

其中只有当所有迭代函数完成时才调用回调函数。

利用这一点,你可以更新回调函数

function (err){ 
    if(err) {//handle err} 
    results = [] 
} 

这应该清除结果阵列后eachSeries