在cujojs rest.js中止Xhr

时间:2015-10-02 05:31:13

标签: javascript ajax rest request xmlhttprequest

我使用cujojs/rest向我的(laravel)API发送请求。我正在寻找一种方法来取消新的请求时尚未结束的请求。

客户端上有一个取消方法,这可能是我解决问题所需要的:

我的应用程序显示了一个分页的项目集合,人们可以通过单击" next / prev"来浏览页面。按钮。 如果用户点击了下一次'快速按钮每个新页面都会触发一个新请求。我想确保只有最新的请求才会开始,所有其他(未完成的)请求都会中止。

当我使用其他工具执行请求时,我曾经使用beforeSend方法执行此操作。它会将xhr对象添加到数组中,在触发请求之前,如果它们没有结束,它将在该数组中的所有xhr上调用.abort()。

现在我切换到了cujojs / rest,我无法弄清楚如何使用cancel方法来实现它。

当然,我不想在新的请求运行之前中止任何请求,只是那些使用相同资源的请求,因为我可能在其他地方加载了不相关的数据。

/users?page=1 -> should be canceled
/users?page=2 -> should be canceled
/preferences  -> should NOT be canceled
/users?page=3 -> should be canceled
/users?page=4 -> should go through as its the last one

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我不确定,因为据我所知,没有适当的文件。但从源代码判断,你应该可以做这样的事情

//lets say you defined **this.request** somewhere in the constructor to hold the request value which defaults to empty object {};

fetchCollection: function(id) {

var that = this;
var url = 'collections/' + id;

if( Object.keys( that.request ).length !== 0 ) {

    if( 'function' === typeof that.request.cancel )
         that.request.cancel();
    else
         that.request.canceled = true;

  //here we should re-assign the default {} value again
  that.request = {};


}
that.request.path = url;

return client( that.request ).then(
        function(response){
            that.collection = response.entity.data;
        },
        function(response){
            console.error(response.status.code, response.status);
        }
    );
},

如果有效,我可以解释原因。

好的,现在当它工作时,我可以解释为什么使用伪代码:

在执行任何操作之前,客户端(请求)函数 cujojs

  1. 检查 request.canceled 是否存在且等于true

  2. 如果符合条件,则中止请求

  3. 如果 request.canceled 不存在,则继续并转到下一步

    1. cujojs 定义了 request.cancel 功能,该功能可以在发送请求之前中止请求(我们不关心以后的步骤,因为取消是我们的意图)< / LI>

      现在我们正在做的是使用javascripts先天能力通过引用传递变量通过引用表示当您为 create()函数提供变量请求时,该函数会在其内部使用此相同变量,而不是创建变量请求的全新副本并使用该副本。

      我们在这里利用它的方式是我们在 cujojs 之外操纵请求变量,知道它正在使用相同的变量,因此我们的操作会直接影响< strong>请求变量 cujojs 在执行时使用 create()函数。

      现在我们知道cujojs有两种取消请求的方法,并且我们可以在 create()函数收到它之后操作 request 变量,我们做了一个简单的检查我们这边:

      1. 我们检查 this.request 是否为空(如果尚未发送请求,则只会为空)

      2. 如果它不是空的,我们会检查 cujojs 是否已经在我们的请求变量中定义了 .cancel 功能<强>&#39;功能&#39; === typeof request.cancel

      3. 如果有,我们可以使用此功能取消之前发送的请求, 如果我们还不知道 cujojs 目前在检查请求变量上的 .canceled 变量的步骤中,那么我们分配这是真的做 this.request.canceled = true ;

      4. 取消请求后,我们会分配请求全新值 {} ,从而将引用丢失到之前的请求我们之前操作的变量

      5. 我很难解释事情,但我希望你理解,知道这些细微差别对你的发展有很大的帮助。

        快乐编码