使用deferred强制一次调用在刷新之前完成

时间:2017-11-02 21:13:07

标签: javascript jquery ajax iframe jquery-deferred

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

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

如何在iframe完成工作后刷新页面?有人建议我使用承诺,但我在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);
}

1 个答案:

答案 0 :(得分:0)

当调度iframeCall()元素load事件时,您可以从iframe返回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;
})