首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在cujojs rest.js上中止Xhr

在cujojs rest.js上中止Xhr
EN

Stack Overflow用户
提问于 2015-10-02 05:31:12
回答 1查看 234关注 0票数 0

我使用丘吉尔/休息向我的(laravel) API发送请求。我正在寻找一种方法,以取消请求,但没有结束时,一个新的进来。

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

我的应用程序显示了一个分页的项目集合,人们可以通过点击"next/prev“按钮浏览页面。如果用户多次点击“next”按钮,那么每一个新页面都会触发一个新请求。我想确保只有最新的请求才能进行,所有其他(未完成的)请求都被中止。

当我使用另一个工具来执行请求时,我经常使用beforeSend方法来完成这个任务。它会将xhr对象添加到数组中,并且在触发请求之前,如果该数组中的所有xhr都没有结束,它将对其调用.abort()。

现在我切换到cujojs/rest,我不知道如何使用cancel方法来完成这个任务。

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

代码语言:javascript
复制
/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

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-03 10:27:22

我不确定,因为据我所能找到的,没有适当的文件。但是从源代码来看,您应该可以这样做

代码语言:javascript
复制
//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. 如果满足条件,则中止请求

如果request.canceled不存在,它将继续下去,并进入下一步

  1. request.cancel函数定义了cujojs,它可以在请求发送之前中止请求(我们不关心之后的步骤,因为取消是我们的目的)

现在我们要做的是使用javascripts天生的能力,通过引用传递变量。通过引用,意味着当您给create()函数一个变量request时,该函数在其内部使用相同的变量,而不是创建变量request的全新副本并使用该副本。

我们在这里利用这一点的方式是,我们从cujojs外部操作请求变量,因为它使用的是相同的变量,因此我们的操作将直接影响执行create()E 236函数时使用的请求变量cujojs。

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

  1. 我们检查this.request是否为空(只有在尚未发送请求的情况下才为空)
  2. 如果它不是空的,我们检查cujojs是否已经通过执行‘函数’===类型request.cancel在请求变量上定义了.cancel函数
  3. 如果是的话,我们可以使用这个函数取消我们以前发送的请求,如果不知道cujojs现在正在检查请求变量上的.canceled变量,那么我们就将它赋值给true this.request.canceled = true;
  4. 取消请求后,我们为 request 分配全新的值{},从而失去对我们先前操作的request变量的引用。

我很难解释事情,但我希望你能理解,知道这些细微之处会对你的发展有很大帮助。

快乐编码

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32901069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档