使用延迟强制在刷新之前完成一个调用[重复]

Posted

技术标签:

【中文标题】使用延迟强制在刷新之前完成一个调用[重复]【英文标题】:Using deferred to force one call finishes before refresh [duplicate] 【发布时间】:2018-04-15 12:51:14 【问题描述】:

我的 javascript 代码中有一个 ajax 调用,它在来自服务器端代码的响应中接收一个 GUID。在成功方法上,它使用该 GUID 调用 iframe,然后在调用完成后,它应该刷新页面。

我在提琴手看到的是 iframe 会话正在中止。我唯一的猜测是它在强制刷新时被浏览器中止:如果我删除刷新部分,iframe 会话会发送请求并成功接收响应。

如何在 iframe 完成工作后刷新页面? 有人建议我使用 Promise,但我在 jQuery 中尝试了$.Deferred(),但仍然没有成功。我想我没有正确使用$.Deferred() 方法。

注意:如果我将 ajax 设置为同步调用,它会起作用,但我希望找到更好的解决方案。

这是我的代码:

foo() 
   this.$link.click((e) => 
        e.preventDefault();
        $.ajax(
          url: "/serverEndpoint",
          type: "POST",
          success: (id) => 
          this.iframeCall(id);
          window.location.href = window.location.origin;
          ,
          error: function (XMLHttpRequest, textStatus, errorThrown) 
          
         );
    );
 

iframeCall(id) 
   var iframe = document.createElement('IFRAME');
   iframe.setAttribute("src", someUrl+id);
   iframe.style.display = 'none';
   document.body.appendChild(iframe);

【问题讨论】:

它需要访问服务器端代码。你知道我怎样才能让 iframeCall 成为一个承诺并在 .then 中有刷新页面吗?我试过但没有成功 对不起,我以为你问的是第一个 ajax,iframe 会改变端点上的一些状态,需要一个 iframe 调用。那部分我无法改变 不同的域 我们走了,:)。好的,您可以在 iframe 上放置一个加载事件处理程序。但我对此并不完全确定。 【参考方案1】:

iframe元素的load事件被调度时,你可以从iframeCall()返回一个jQuery延迟对象,然后执行任务

iframeCall(id) 
   return new $.Deferred(function(dfd) 
     var iframe = document.createElement('IFRAME');
     iframe.onload = dfd.resolve;
     iframe.setAttribute("src", someUrl+id);
     iframe.style.display = 'none';
     document.body.appendChild(iframe);
   )

this.iframeCall(id).then(function() 
  window.location.href = window.location.origin;
)

【讨论】:

您好,感谢您的回答,我尝试了 iframe 的这个解决方案,但页面没有刷新:window.location.href = window.location.origin;。任何一点为什么或如何解决它? 什么是window.location.origin 它是根页面,基本上这使得页面刷新 那么代码应该返回预期的结果。 “不刷新”是什么意思? 那么iframe 可能没有被加载。你能在 plnkr plnkr.co 重现问题吗?

以上是关于使用延迟强制在刷新之前完成一个调用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

等到三个 ajax 调用解决触发函数(延迟?)

延迟按钮动画CSS [重复]

$(window).unload 在离开网页之前等待 AJAX 调用完成[重复]

在android中使用媒体播放器时如何避免音频剪辑重复之前的延迟

在异步延迟问题上运行多个脚本[重复]

强制 VBA 等到电源轴完成刷新