我使用丘吉尔/休息向我的(laravel) API发送请求。我正在寻找一种方法,以取消请求,但没有结束时,一个新的进来。
客户端上有一个cancel方法,这可能是我解决问题所需要的:
我的应用程序显示了一个分页的项目集合,人们可以通过点击"next/prev“按钮浏览页面。如果用户多次点击“next”按钮,那么每一个新页面都会触发一个新请求。我想确保只有最新的请求才能进行,所有其他(未完成的)请求都被中止。
当我使用另一个工具来执行请求时,我经常使用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任何帮助都将不胜感激。
发布于 2015-10-03 10:27:22
我不确定,因为据我所能找到的,没有适当的文件。但是从源代码来看,您应该可以这样做
//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中,在做任何事情之前都要执行以下操作:
如果request.canceled不存在,它将继续下去,并进入下一步
现在我们要做的是使用javascripts天生的能力,通过引用传递变量。通过引用,意味着当您给create()函数一个变量request时,该函数在其内部使用相同的变量,而不是创建变量request的全新副本并使用该副本。
我们在这里利用这一点的方式是,我们从cujojs外部操作请求变量,因为它使用的是相同的变量,因此我们的操作将直接影响执行create()E 236函数时使用的请求变量cujojs。
既然我们知道cujojs有2种取消请求的方法,并且我们可以在create()函数收到之后操作 request 变量,那么我们可以在我们这边做一个简单的检查:
我很难解释事情,但我希望你能理解,知道这些细微之处会对你的发展有很大帮助。
快乐编码
https://stackoverflow.com/questions/32901069
复制相似问题