如何调用函数一次forEach循环完成?

时间:2017-06-13 16:47:43

标签: javascript node.js callback

我必须根据条件对一些数据进行排序并将其推送到新的数组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.
    });
  });
}

3 个答案:

答案 0 :(得分: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.
    });
}

答案 1 :(得分:1)

private lazy var __once: () = { () -> Void in [weak self] guard let strongSelf = self else{return} let bundle = Bundle(for: type(of: strongSelf)) strongSelf.contentView = UINib(nibName: "MyView", bundle: bundle).instantiate(withOwner: self, options: nil)[0] as! UIView strongSelf.contentView.translatesAutoresizingMaskIntoConstraints = false strongSelf.addSubview(strongSelf.contentView) let view = ["contentView": strongSelf.contentView] strongSelf.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[contentView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: view)) strongSelf.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[contentView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: view)) strongSelf.titleMyLabel.text = MyView.myTitle strongSelf.descriptionMyLabel.text = MyView.myDescription strongSelf.mobileNumberLabel.text = MyView.numberMobile MyView.myBarBotton.botaoMudou(.hight) MyView.myBarBotton.botaoMudou(.left) MyView.myBarBotton.botaoMudou(.center) strongSelf.setNeedsUpdateConstraints() }() 没有将2个函数作为参数。

以下MDNforEach函数的语法。

forEach

所以,第二个功能被忽略了,没有意义。因为,您没有在arr.forEach(function callback(currentValue, index, array) { //your iterator }[, thisArg]); 中执行任何异步操作。因此,您可以依赖于forEach完成后所需的工作完成,并且在完成forEach函数后调用函数forEach是安全的。

asyncFiles

答案 2 :(得分:0)

从您的代码示例中未调用asyncFiles,因为forEach取1个arg而不是2但如果要在执行异步调用的forEach循环之后调用函数,则可以使用async库中的map函数。

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
});