2017-06-13 86 views
1

我必須根據條件對一些數據進行排序,並將其推送到新的數組sortedFiles,因此基本上一旦forEach循環完成,我想調用asyncFiles()函數並將對象傳遞給它,但它不會在下面的代碼中發生。任何想法是什麼實施錯誤或任何更好的方法來實現這項任務?如何爲每個循環調用函數完成?

filesData是包含目錄文件的對象。

ctrl.js

if (searchObj.searchEnv === 'stat') { 
    stDirectory.readDirectory(function(files) { 
    filesData.logFiles.forEach(function(file) { 
     var sortedFiles = []; 
     var fileDate = new Date(file.fileDate).getTime(); 
     searchStartDate = new Date(searchStartDate).getTime(); 
     searchEndDate = new Date(searchEndDate).getTime(); 
     if (fileDate - searchStartDate > 0 && searchEndDate - fileDate > 0) { 
     console.log('File Date', file); 
     sortedFiles.push(file); 
     } 
    }, function() { 

     console.log(filesData.logFiles); 
     filesData.logFiles = sortedFiles; 
     asyncFiles(filesData); // Not being called. 
    }); 
    }); 
} 
+1

是否有任何理由,爲什麼你不能只是原來的數組進行排序?您應該花很多時間在array.sort或第三方庫(如_)上,這些庫爲數組添加了許多功能。 –

回答

4

forEach不是一個異步函數,它接受一個可選的完成回調。只需在調用後執行以下操作:

if (searchObj.searchEnv === 'stat') { 
    stDirectory.readDirectory(function(files){ 
     var sortedFiles = []; // move this in front of the loop 
     filesData.logFiles.forEach(function(file){ 
      var fileDate = new Date(file.fileDate).getTime(); 
      var searchStartDate = new Date(searchStartDate).getTime(); // add missing 
      var searchEndDate = new Date(searchEndDate).getTime(); //  `var`s 
      if (fileDate - searchStartDate > 0 && searchEndDate - fileDate > 0) { 
       console.log('File Date',file); 
       sortedFiles.push(file); 
      } 
     }); 
     console.log(filesData.logFiles); 
     filesData.logFiles = sortedFiles; 
     asyncFiles(filesData); // Now being called. 
    }); 
} 
+0

我正在使用'readStream.on('end',function(){'來讀取文件,所以這個錯誤發生,如果我在外面調用'forEach' TypeError:無法讀取屬性undefined – hussain

+0

Where,what?在你的代碼中沒有'readStream',聽起來你應該[用一個新的問題](https://stackoverflow.com/questions/ask)與實際的完整代碼 – Bergi

+0

是的,我沒有添加那篇文章,我認爲這是無關的點 – hussain

1

forEach不帶2個函數作爲參數。

MDN以下是forEach函數的語法。

arr.forEach(function callback(currentValue, index, array) { 
    //your iterator 
}[, thisArg]); 

因此,第二個函數被忽略,沒有任何意義。因爲,您在forEach中沒有執行任何異步操作。因此,您可以信賴一旦forEach完成,完成所需的工作,並在完成forEach函數後調用功能asyncFiles是安全的。

if (searchObj.searchEnv === 'stat') { 
     stDirectory.readDirectory(function(files){ 
     filesData.logFiles.forEach(function(file){ 
      var sortedFiles = []; 
      var fileDate = new Date(file.fileDate).getTime(); 
      searchStartDate = new Date(searchStartDate).getTime(); 
      searchEndDate = new Date(searchEndDate).getTime(); 
       if (fileDate - searchStartDate > 0 && searchEndDate - fileDate > 0) { 
         console.log('File Date',file); 
         sortedFiles.push(file); 
        } 
       }); 


       console.log(filesData.logFiles); 
       filesData.logFiles = sortedFiles; 
       asyncFiles(filesData); // Not being called. 


     }); 
    } 
0

從你的代碼示例asyncFiles不叫,因爲的forEach需要1個ARG不是2,但如果你要調用一個foreach循環是做異步調用,那麼您可以使用地圖功能async庫後的功能。

https://caolan.github.io/async/docs.html#map

async.map(filesData.logFiles, (logFile, next) => { 
    // Do some work with logFile 
    next(); 
}, (err, results) => { 
    // Call function after mapping is complete 
}); 
相關問題