我想等待通过地图功能读取所有图片
我尝试过
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-navbar',
templateUrl: './navbar.component.html',
styleUrls: ['./navbar.component.scss']
})
export class NavbarComponent implements OnInit {
optionEng = 'English';
}
但是我的缓冲区仍然是空的...
我知道承诺存在,但我不知道如何将它们包括在map(map())
谢谢:)
答案 0 :(得分:0)
我将上面的代码重构为:
let files = [];
// loop each dir.
fs.readdirSync(rootFolder).forEach(dirName => {
// if it's a directory, procede.
if(fs.lstatSync(path.join(rootFolder, dirName)).isDirectory()){
console.log(`Entering in folder ${path.join(rootFolder, dirName)}`);
fs.readdirSync(path.join(rootFolder, dirName)).forEach(picture => {
if(fs.lstatSync(path.join(rootFolder, dirName, picture)).isFile()){
// If lstatsync says it's a file and if it starts with "norm"
if(picture.startsWith("norm")){
// push a new promise to the array.
files.push(new Promise((resolve, reject) => {
fileToTensor(path.join(rootFolder, dirName, picture)).then((img) => {
buffer.push(img);
resolve();
}).catch((error) => {console.log(error); reject(error);});
}));
}
}
});
}
});
// Resolve all promises.
Promise.all(files).then(() => {
// Then do whatever you need to do.
console.log(buffer);
}).catch((errors) => {
console.log('one ore more errors occurred', errors);
});
基本上,这就是我所做的:
.map
,因为在这种情况下没有必要。另外,在您的情况下,并非所有代码路径都返回结果,因此并非每个回调都返回结果。Promise[]
。Promise.all
。每个已解决的承诺都会将结果推送到buffer
数组中。我会以不同的方式来处理它,但是,这是我能想到的最快的方法。Promise.all
上注册了一个回调,以便定义buffer
。请注意,有很多第三方库可以帮助您避免嵌套循环并保证循环文件系统。我刚刚发布了这篇文章,试图给出一些可以使用现有代码实际工作的东西,尽管在这里整个重构很聪明,而且对可用节点库的初步分析也将有助于使代码更易于阅读和维护。
答案 1 :(得分:0)
首先提供一些建议:
请勿将箭头功能用于您无法将其放在一行中的任何内容(它们并非用于此目的,这会破坏可读性)
检查传递给.map()的每个回调实际上返回的内容(第一个没有返回。似乎您在内部return
之前错过了fs.readdir(..)...
。
最好尝试命名所有功能(在某些情况下最好选择箭头功能)。这样,我不仅可以命名它以更好地识别它们,而且堆栈跟踪将更易读和有用(可跟踪)。
也就是说,您正在同步读取目录(和子目录)以最终返回承诺(我知道fileToTensor()
应该会返回承诺)。它可能不会对整体执行时间产生重大影响,因为我想实际的文件处理会贵得多,但是这是一个不好的模式,因为您在树扫描期间阻止了事件循环(因此,如果您的代码用于服务器)需要参加其他请愿的活动,您的表现就会降低...)。
最后,正如其他人已经说过的那样,还有诸如glob之类的库可以简化该任务。
另一方面,如果您想自己做(作为一项理解练习),我自己在了解 glob 之前可以为同一任务实施my own library一个简单的例子。
答案 2 :(得分:0)
对,我已经更新了您的代码,请检查一次。可能会有所帮助:)
startActivity(new Intent(SplashScreen.class, StartingPoint.class);