异步匿名函数中then()是否必要?其调用时机与作用探讨
关于异步函数末尾.then()调用时机与作用的解析
嘿,我来帮你梳理清楚这个问题的关键点:
首先要明确一个核心知识点:所有异步函数(即使没有显式写return)都会默认返回一个Promise对象。这个Promise的状态由函数内部的执行结果决定,而你代码末尾的.then()就是用来处理这个Promise的最终状态的。
一、.then()的调用时机
- 成功回调(
_ => console.log('SUCCESS'))触发时机:当整个自执行异步函数的所有代码都顺利执行完成——包括try块里的WebDriver操作全部成功,且finally块里的driver.quit()也没有抛出异常时,异步函数返回的Promise会进入resolved状态,此时这个成功回调就会被调用,打印"SUCCESS"标识整个流程圆满结束。 - 错误回调(
err => console.error('ERROR: ' + err))触发时机:只要异步函数执行过程中任何环节抛出了未被内部捕获的异常,Promise就会进入rejected状态,这个错误回调就会被触发。
二、.then()能捕获哪些异常?
它可不是只处理driver.quit()的错误,而是覆盖了整个流程的异常场景:
- try块中的未处理异常:你的代码里只有
try和finally,没有catch块——如果try里的操作(比如driver.build()启动浏览器失败、driver.get()加载页面出错、元素定位失败等)抛出异常,这个异常不会被内部消化,会直接让异步函数返回的Promise变成rejected,最终被.then()的错误回调捕获。 - finally块中的异常:如果
finally里的driver.quit()执行出错(比如driver实例已经失效、quit过程中浏览器崩溃等),这个异常会成为Promise的rejected原因,同样会被错误回调捕获。甚至如果try块已经抛出异常,但finally块又抛出了新的异常,那么最终被捕获的会是finally里的异常(因为finally的异常会覆盖之前的异常)。
三、额外补充
你可能会疑惑:为什么函数里没return,却能链式调用.then()?因为异步函数的特性就是自动包装返回值为Promise——哪怕你什么都没return,它也会返回一个状态为resolved、值为undefined的Promise,所以链式调用是完全合法的。
内容的提问来源于stack exchange,提问作者Merc
相关产品推荐
相关产品推荐

