如何在javascript / typescript中等待异步超级函数?[关闭]

How to await an async super function in javascript/typescript? [closed]

提问人:goastler 提问时间:10/11/2023 更新时间:10/11/2023 访问量:59

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

上个月关闭。

在打字稿中,假设我有以下两个类:

class X {
    constructor() {
    }

    public async doSomething(): Promise<string> {
        console.log('x')
        return 'x'
    }
}

class Y extends X {
    constructor() {
        super()
    }

    public override async doSomething(): Promise<string> {
        console.log('y before')
        await super.doSomething()
        console.log('y after')
        return 'y'
    }
}

然后我运行以下命令:

const y = new Y()
y.doSomething()

我希望输出是:

y before
x
y after

但相反,它是:

y before
x

几乎就像没有等待任何东西一样。我一直在研究它,发现如果我在承诺最终解析并打印后添加一些代码,则进一步支持我的理论,即它没有正确等待。await super.doSomething()y.doSomething()y after

这是怎么回事?

javascript typescript 异步 async-await promise

评论

3赞 epascarello 10/11/2023
我得到了预期的结果 jsfiddle.net/epascarello/80ov2ec9
0赞 epascarello 10/11/2023
最好将承诺写成public async doSomething(): Promise<string> { return new Promise(resolve => { console.log('x') resolve('x'); }); }
1赞 Konrad 10/11/2023
@epascarello怎么更好呢?如果你不使用,为什么你会将函数标记为异步?await
0赞 epascarello 10/11/2023
因为它是一个更好的承诺测试用例......
1赞 Konrad 10/11/2023
这些完全相同,但您的可读性较差

答:

1赞 Konrad 10/11/2023 #1

似乎工作正常

class X {
  constructor() {}

  async doSomething() {
    console.log('x')
    return 'x'
  }
}

class Y extends X {
  constructor() {
    super()
  }

  async doSomething() {
    console.log('y before')
    await super.doSomething()
    console.log('y after')
    return 'y'
  }
}

const y = new Y

y.doSomething()

原始可能引发错误,因此没有输出doSomething'y after'

class X {
  constructor() {}

  async doSomething() {
    console.log('x')
    throw 'e'
    return 'x'
  }
}

class Y extends X {
  constructor() {
    super()
  }

  async doSomething() {
    console.log('y before')
    await super.doSomething()
    console.log('y after')
    return 'y'
  }
}

const y = new Y

y.doSomething()

评论

3赞 goastler 10/11/2023
正如评论中指出的,我的代码是演示该问题的玩具示例。在我的代码末尾,我有 ,结果证明这是问题的一部分。我错过了代码中的其他地方,这意味着直到完成才等待承诺,并且 nodejs 在完成承诺之前就已经到达了行。添加缺失解决了一切。所以@Konrad这里的答案是正确的,它确实有效,但是对于其他有这个问题的人来说,请搜索丢失的 s!process.exit(0)awaitprocess.exit(0)awaitawait