我正在构建一个应用程序段,该段将从我的个人GitHub帐户中获取存储库数据(语言和代码字节)。我为此任务定义了三个数组:
repos
:存储存储库的名称languages
:存储语言bytesOfCode
:存储以给定语言编写的代码字节问题是最后两个数组在then()
内本地填充,但是此更改在全局范围内不可见。我对JavaScript开发比较陌生,因此非常感谢任何帮助。
我尝试在then()
内声明一个临时数组,并将其分配给全局数组,但无济于事。我也在尝试async/await
(在await this.octokit.repos.listlanguages
内制作async (repoName: string)
,但是在尝试访问data
时遇到了关于未处理的诺言的错误。
这是有问题的代码:
repos.forEach((repoName: string) => {
this.octokit.repos.listLanguages({
repo: repoName,
owner: 'PeroAlex'
}).then((repoInformation: any) => {
for (let language in repoInformation.data) {
if (!lodash.isNil(language)) {
if (languages.indexOf(language) < 0) {
languages.push(language);
bytesOfCode.push(repoInformation.data[language]);
} else {
bytesOfCode[languages.indexOf(language)] += repoInformation.data[language];
}
}
}
console.log(languages);
console.log(bytesOfCode);
}).catch((err: Error) => console.log(err.name));
});
console.log(languages);
console.log(bytesOfCode);
我可以确认languages
和bytesOfCode
数组的内部实例正确更新,但外部实例保持为空。
同样,我不希望有人代替我,但是如果有人可以指出我在这里所缺少的内容,我将不胜感激。谢谢!
编辑:该问题被错误地标记为重复,因此我无法提供正确的答案,但是如果其他人遇到相同的问题,则会在此处提供解决方案作为编辑。解决方案是避免使用forEach()
,而使用普通的for...of
类型的循环
for (let repoName of repos) {
try {
const repoInformation: any = await octokit.repos.listLanguages({
repo: repoName,
owner: username
});
const languageValues: Array<string> = Object.keys(repoInformation.data);
languageValues.forEach((language: string) => {
if (!lodash.isNil(language)) {
if (languages.indexOf(language) < 0) {
languages.push(language);
bytesOfCode.push(repoInformation.data[language]);
} else
bytesOfCode[languages.indexOf(language)] += repoInformation.data[language];
}
});
} catch (e) {
console.error(e.message);
}
}
感谢善良的人,他们实际上很有帮助,并设法指出了我的错误。