我必须根据条件对一些数据进行排序并将其推送到新的数组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.
});
});
}
答案 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个函数作为参数。
以下MDN是forEach
函数的语法。
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
});