TypeScript数组填充在then()内部,但此更改在全局上不可见

时间:2019-07-10 09:53:16

标签: javascript arrays typescript promise

我正在构建一个应用程序段,该段将从我的个人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);

我可以确认languagesbytesOfCode数组的内部实例正确更新,但外部实例保持为空。

同样,我不希望有人代替我,但是如果有人可以指出我在这里所缺少的内容,我将不胜感激。谢谢!

编辑:该问题被错误地标记为重复,因此我无法提供正确的答案,但是如果其他人遇到相同的问题,则会在此处提供解决方案作为编辑。解决方案是避免使用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);
    }
}

感谢善良的人,他们实际上很有帮助,并设法指出了我的错误。

0 个答案:

没有答案