fetch的then()使用疑问:无需返回Promise时获取更新邮件数组并验证写法
三种
then()写法的正确性核对 先明确链式调用的核心规则
then()接收的参数必须是回调函数,回调内部的逻辑会严格等待上一级Promise的状态变更(resolve/reject)后才触发- 回调的返回值,会作为下一级
then()的入参;如果回调没有显式返回值,下一级then()收到的就是undefined - 如果
then()传入的不是函数,而是直接执行的函数调用结果,那么上一级Promise的返回值会直接被透传到下一级,传入的函数会在then()挂载时立刻执行,完全不等待上一级的异步完成
逐一对写法和注释做校验
- 写法(1)
.then(load_mailbox('inbox'))
你的注释核心方向正确。本质是挂载then的瞬间就立刻执行load_mailbox('inbox'),完全不等fetch的PUT请求完成——请求刚发出去、还没收到服务端响应时,load_mailbox就已经跑了,极易拉取到未更新的旧邮件数据。因为传入then的不是回调函数,fetch最终返回的Response对象会直接透传到最后的(4)号then里,你测试时应该能看到(4)打印出fetch的原始响应,而非undefined。 - 写法(2)
.then((response) => load_mailbox('inbox'))
你的注释完全正确。这个写法的回调会等待fetch请求完成后才触发,因为回调内部没有返回fetch的原始response对象,而是返回了load_mailbox的执行结果,所以最后(4)的then拿不到fetch的原始响应。你测试时(4)打印undefined,本质是load_mailbox本身没有显式返回值,和写法逻辑无关。 - 写法(3)
.then(() => load_mailbox('inbox'))
这个写法完全正确,完全匹配你的需求。它和写法(2)的执行时序没有任何区别:都会严格等fetch的归档接口真正收到服务端响应后,再触发load_mailbox拉取更新后的邮件数组。唯一区别是回调里省略了没用的fetch响应参数(因为你本来就不需要读取这个响应的内容),不存在时序错误、提前执行的问题。你测试时(4)打印undefined,同样是因为load_mailbox没有返回值,和写法正确性无关。
关键澄清
你之前观察到“(2)(3)的返回Promise在下一个then里访问不到”是误解:并不是Promise被隐藏了。如果你的load_mailbox本身是返回Promise的异步函数,链式调用还会自动等待load_mailbox执行完成后,把load_mailbox的返回值传给最后一个then;如果load_mailbox没有任何return语句,自然所有后续then拿到的都是undefined。
对于你“不需要fetch返回内容、只想等fetch执行完拉取最新邮件”的场景,写法(3)是最简洁合适的选择,不存在逻辑漏洞。
内容的提问来源于stack exchange,提问作者rickyc
相关产品推荐
相关产品推荐

