变量在被分配错误之前使用,即使它们是在等待的Promise.all中设置的



我有两个彼此独立的异步方法,为了节省时间,我想同时运行它们。但是,要继续执行下面的步骤,我需要等待这两个方法的返回值。我的代码看起来像这样:

public async methodOne(): Promise<MyObjectOne> {
... do something interesting
return one;
}
public async methodTwo(): Promise<MyObjectTwo> {
... do something interesting
return two;
}
public useVariables(one: MyObjectOne, two: MyObjectTwo) {
... do some useful work
}
public async runTogether(): Promise<void> {
let one: MyObjectOne;
let two: MyObjectTwo;
await Promise.all([this.methodOne(), this.methodTwo()])
.then((values: [MyObjectOne, MyObjectTwo]) => {
values.map((value: MyObjectOne | MyObjectTwo) => {
if (value instanceof MyObjectOne) {
one = value;
} else {
two = value;
}
});
})
.catch((error) => {
throw new Error('There was an error');
});
this.useVariables(one, two);
}

根据我的最佳理解,当程序到达最后一行this.useVariables(one, two);时,要么两个变量都设置好了,要么抛出了错误。

但是IDE在这两个变量上都指示CCD_。

在使用这两个变量来消除错误之前,我可以检查是否有未定义的。但我想知道这条信息是否表明我错过了什么。或者仅仅是IDE没有意识到变量已经设置?或者,是否有更好的方法同时运行这两种方法?

在回调中为外部变量赋值有点像代码味道,TypeScript也有一些问题。它无法判断回调是否会运行,因此会产生警告。

有关产生相同错误的较小示例,请参阅:

let numOuter: number;
[].forEach((num) => {
numOuter = num;
});
console.log(numOuter); // Variable 'numOuter' is used before being assigned.

在您的情况下,错误更合理,因为-如果抛出错误怎么办?那么onetwo仍然是undefined——执行this.useVariables(one, two);是不安全的,因为你不确定这个过程是否成功。

TypeScript在使用can结构代码时工作得最好,以便在可能的情况下使用const。改为使用:

public async runTogether(): Promise<void> {
const [one, two] = await Promise.all([this.methodOne(), this.methodTwo()]);
this.useVariables(one, two);
}

(确保键入methodOne以返回MyObjectOne的类型,对于methodTwo也是如此(

因为runTogether返回Promise,所以methodOnemethodTwo抛出的可能错误几乎肯定会在调用链上传递给调用者,由调用者处理——这样,调用者就可以查看是否存在问题,并进行适当的处理。如果您处理runTogether本身内部的错误,那么调用者将无法看到有错误,除非您重新抛出。有这样的用例,但它有点难看。

最新更新