You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Async Fetch发送POST请求后如何确保请求完成再关闭窗口

你当前代码的问题出在then的传参逻辑:then方法要求传入回调函数作为参数,你直接写window.close()会立刻执行关闭窗口的逻辑,再把执行返回的undefined传递给then,自然会出现请求还未完成窗口就被关闭的情况。

方案1:调整then参数写法

将关闭逻辑包裹在匿名函数中传入then,同时补充错误捕获逻辑,避免请求报错时窗口无法关闭:

async function postData() {
    const response = await fetch(destinationUrl, fetchOptions);
    return response.json();
}

postData()
  .then(() => window.close())
  .catch(() => window.close());

如果只需要请求成功时才关闭窗口,删除catch段即可。

方案2:统一使用async/await语法,逻辑更直观

把调用逻辑也放入异步函数中,等待请求完成后再执行关闭:

async function postData() {
    const response = await fetch(destinationUrl, fetchOptions);
    return response.json();
}

async function handlePostAndClose() {
  try {
    await postData();
    // 仅请求成功时关闭写在这里
    window.close();
  } catch (err) {
    // 请求报错时的处理逻辑,需要的话也可以在这里加关闭
  }
}

handlePostAndClose();

如果无论请求成功失败都要关闭窗口,可以把window.close()放在finally代码块中。

可选优化方案(仅上报类请求适用)

如果你的请求不需要处理服务端返回结果,只是要把数据发送给服务端,可以使用浏览器内置的navigator.sendBeaconAPI,这个API原生保证页面卸载前也能完成请求发送,写法更简单:

// 第二个参数为要发送的数据,支持FormData、Blob、字符串等类型
navigator.sendBeacon(destinationUrl, postData);
window.close();

内容的提问来源于stack exchange,提问作者Newb 4 You BB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:45:03