【问题标题】:how to kill an older jsonp request?如何杀死较旧的 jsonp 请求?
【发布时间】:2011-02-15 10:59:15
【问题描述】:

我有一个使用 getJSON 的跨域长轮询请求,回调看起来像这样:

$.getJSON("http://long-polling.com/some.fcgi?jsoncallback=?"
    function(data){
          if(data.items[0].rval == 1) {
            // update data in page
          }
    });

问题是对长轮询服务的请求可能需要一段时间才能返回,同时可能会发出另一个 getJSON 请求并更新页面,即使它是过时的响应。

请求 1: h**p://long-polling.com/some.fcgi 在 上午 10:00

请求 2: h**p://long-polling.com/some.fcgi?在 上午 10:01

Req1 返回并更新数据 页面 10:02 AM

如果 Req2 已经完成,我想要一种方法来使 Req1 的返回无效。

谢谢!

【问题讨论】:

    标签: jquery jsonp


    【解决方案1】:

    我认为这不起作用,因为 getJSON 使用 JSONP 方法,该方法实际上是通过动态插入浏览器执行的脚本标记来工作的。我认为没有任何方法可以阻止浏览器执行脚本...有吗?

    【讨论】:

    【解决方案2】:

    当您发出 ajax 请求时,它会返回 XMLHttpRequest 对象。如果你想abort调用你可以调用.abort()方法就可以了。

    var request = $.getJSON(. . . . . );
    request.abort();
    

    【讨论】:

    • JSONP 不使用 XMLHttpRequest,它会在页面中注入一个 HTML
    【解决方案3】:

    正如@NewToDB 提到的,您不能取消 jsonp 请求(例如,告诉浏览器停止尝试加载标签的 src),但您可以实现一种机制,有效地忽略旧调用的返回数据。定义一个全局变量,每次您要进行 jsonp 调用时递增,并将该变量的值作为参数传递给服务器。您还需要将计数器从服务器传回(我假设您还拥有服务器代码)。如果您的计数器的当前值不等于返回的计数器值,那么您知道已经进行了另一个服务器调用,因此您可以忽略返回的数据。

    // Global counter
    var callCounter = 0;
    

    ...

    $.getJSON("http://long-polling.com/some.fcgi?callCounter=" + (++callCounter) + "&jsoncallback=?"
        function(data){
              if(data.items[0].rval == 1 && data.callCounter == callCounter) {
                // update data in page
              }
        });
    

    【讨论】:

      【解决方案4】:

      我使用全局变量来完成这样的任务。这不是一个很好的方法,但却是最简单的一种。

      if (typeof(myFooRequest) == 'object') {
        myFooRequest.abort();
        myFooRequest = false;
      }
      myFooRequest = $.get("/url", function(data) {
        // ...
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-12
        • 1970-01-01
        相关资源
        最近更新 更多