在setTimeout(async () => { 里面执行window.open 打不开新页面怎么办
时间: 2024-10-08 19:14:56 浏览: 31
前端面试大厂手写源码系列(上)
在使用 `setTimeout` 和 `async/await` 结合的情况下,如果尝试直接在回调函数里执行 `window.open` 来打开新页面,可能会因为同步特性导致新页面无法立即打开。这是因为 `window.open` 是一个异步操作,而 `setTimeout` 是同步的,它会等待一段时间后再执行指定的回调。
解决这个问题的一个常见做法是将 `window.open` 放在一个独立的 promise 中,然后使用 `await` 来确保其完成后再继续。例如:
```javascript
async function openPageAfterDelay(url) {
try {
await new Promise((resolve) => setTimeout(resolve, 0)); // 强制执行异步操作
await window.open(url, '_blank', 'noopener noreferrer');
} catch (error) {
console.error("Error opening page:", error);
}
}
// 调用函数并传递页面地址
openPageAfterDelay('https://example.com/newpage');
```
在这个版本里,`setTimeout` 的延迟时间设为 0 秒,实际上是为了让 `window.open` 开始执行。然后我们使用 `await` 等待该 promise 解决,确保新页面打开后再继续程序。
阅读全文