如何让for循环等待每个tempWindow函数执行完成后再执行下一次迭代?
改造实现方案
你的思路是正确的,将tempWindow改造为返回Promise,窗口关闭时触发Promise决议,再配合await等待即可实现依次打开窗口的需求。
改造后页面1完整代码
// 改造tempWindow为返回Promise function tempWindow(text) { return new Promise((resolve) => { // 参数做URI编码,避免特殊字符导致传参错误 const w = window.open('https://example.com/?data=' + encodeURIComponent(text), '_blank'); const t = setInterval(() => { if(w.closed) { clearInterval(t); resolve(); // 窗口关闭后决议Promise,结束等待 } }, 100); }) } const list = ['text1', 'text2', 'text3']; // 用async自执行函数包裹循环逻辑,支持await语法 (async () => { // 使用let声明i避免变量提升问题,也可以改用for of遍历 for(let i = 0; i < list.length; i++) { // 等待当前窗口关闭后再进入下一轮循环 await tempWindow(list[i]); } })();
注意事项
- 浏览器默认会拦截非用户主动交互触发的弹窗,如果你是在页面加载时自动触发该逻辑,可能会被弹窗拦截机制拦截,建议将触发入口绑定到用户点击、按键等主动交互事件上。
- 如果传递的text参数包含中文、特殊符号,必须加
encodeURIComponent编码,否则会导致URL参数解析错误。
内容的提问来源于stack exchange,提问作者Marcos Santos
相关产品推荐
相关产品推荐

