在Playwright中,调用内部含await的async函数需加await吗?
结论很明确:必须加await,原因如下:
async函数的本质是返回Promise
不管你的async函数内部有没有写await,只要函数被标记为async,它的返回值就一定是一个Promise对象。你调用someInstance.open()的时候,这个调用会立刻返回一个pending状态的Promise,而函数内部的await this.page.goto(path)只是让函数内部的代码等待跳转完成,但外部代码不会自动等待这个Promise完成。不加await会导致异步操作未完成就执行后续代码
在你的场景里,调用someInstance.open()不加await的话,代码会直接跳过页面跳转的等待逻辑,继续执行后面的测试步骤——这时候页面可能还在加载中,后续操作自然会出问题。加上await之后,代码会等待open()函数返回的Promise被resolve(也就是页面跳转完成),再继续往下走,这才符合测试流程的预期。内部的await和外部的await作用范围不同
函数内部的await是用来处理函数内部的异步任务(比如page.goto),确保函数内部的代码按顺序执行;但这和函数本身作为一个异步任务被外部调用是两回事。外部必须通过await(或者.then())来等待整个async函数的异步流程完成。
举个简单的类比:你让同事帮你取个快递(async函数),同事自己会等快递到了再回来(内部await),但如果你不等着同事回来(外部不加await),直接就想拆快递(后续操作),那肯定拿不到东西。
内容的提问来源于stack exchange,提问作者msmith1114

