Javascript 针对AJAX调用处理范围外变量
我有以下代码:Javascript 针对AJAX调用处理范围外变量,javascript,ajax,Javascript,Ajax,我有以下代码: var User = { get: function (options) { var self = this; $.ajax({ url: options.url, success: function (data, response) { self.nextPageUrl = data.pagination.next_page; options.success(data, response);
var User = {
get: function (options) {
var self = this;
$.ajax({
url: options.url,
success: function (data, response) {
self.nextPageUrl = data.pagination.next_page;
options.success(data, response);
}
});
},
nextPage: function (success) {
this.get({
url: this.nextPageUrl,
success: success
});
}
}
User.get({
url: 'https://cache.getchute.com/v2/albums/aus6kwrg/assets',
success: function (data, response) {
// Through `data.pagination.next_page` I can get the URL
// of the next page.
}
});
User.nextPage({
success: function (data, response) {
// Here I want to make the same request but using the next_page
// based on the next related to the previous' one.
}
});
问题
基本上,我想基于antecessor请求(User.get()
)执行nextPage()
操作,但由于其异步性,nextPage()
方法不知道它返回的this.nextPage url
属性
最后,问题是:是否有人能以某种方式保持当前语法流,但解决这种方法?事实上,有办法吗
不,我不能提出同步请求
常识
我想使用事件机制来处理这个问题:当发出请求并调用.nextPage()
时,然后尝试侦听要发出的事件x秒,然后我希望this.nextPageUrl
属性在基于事件的范围内可用
你们觉得怎么样
免责声明:服务器对下一页的逻辑进行预处理,然后才发送到客户端。我没有选择使用递增/递减行为操作
如果您想解决这个问题,.您可以在发出异步请求之前获取对用户对象的引用
var User = {
get: function (options) {
var self = this;
$.ajax({
url: options.url,
success: function (data, response) {
self.nextPageUrl = data.pagination.next_page;
options.success(data, response);
}
});
},
有两种选择。您可以将属性的setter绑定到也调用nextPage
,您可以每隔n毫秒从调用nextPage
进行轮询,直到填充nextPage属性,您可以使用承诺,您可以使用nextPage队列
我认为排队可能是完成这项工作的最简单形式。我还认为,在这种情况下,让用户存储一些局部变量可能会很有用,而函数对象的使用可能更符合这一点
看起来是这样的
var User = new function(){
var pageQueue = [];
var get = this.get = function (options) {
$.ajax({
url: options.url,
dataType: 'JSON',
success: function (data, response) {
options.success(data, response);
var nextPageUrl = data.pagination.next_page;
if( pageQueue.length > 0 ){
pageQueue[0](nextPageUrl);
pageQueue.splice(0,1);
}
}
});
};
var nextPage = this.nextPage = function (options) {
pageQueue.push(function(nextPageUrl){
get({
url: nextPageUrl,
success: options.success
});
});
};
};
你的电话也不会改变
User.get({
url: 'https://cache.getchute.com/v2/albums/aus6kwrg/assets',
success: function (data, response) {
// Through `data.pagination.next_page` I can get the URL
// of the next page.
console.log('get');
console.log(data);
console.log(response);
}
});
User.nextPage({
success: function (data, response) {
// Here I want to make the same request but using the next_page
// based on the next related to the previous' one.
console.log('next');
console.log(data);
console.log(response);
}
});
您可以修改get方法并完全删除下一页方法:
var User = {
url: 'https://cache.getchute.com/v2/albums/aus6kwrg/assets',
get: function (options) {
var self = this;
self.pageXhr = $.ajax({
url: self.nextPageUrl ? self.nextPageUrl : self.url,
dataType: 'JSON',
success: function (data, response) {
self.nextPageUrl = data.pagination.next_page;
self.pageXhr = false;
options.success(data, response);
}
});
}
}
然后,无论何时调用User.get,它都将调用当前页或下一页。我不确定您何时希望获取后续页面的上下文,但如果需要将请求排队,您可以等待现有请求完成,然后再触发下一个请求。例如:
if (self.pageXhr) {
self.pageXhr = self.pageXhr.then(function() {
return $.ajax({
url: self.nextPageUrl ? self.nextPageUrl : self.url,
dataType: 'JSON',
success: function (data, response) {
self.nextPageUrl = data.pagination.next_page;
options.success(data, response);
}
});
});
}
让get
返回一个承诺,然后调用nextPage
并给出结果。事实上,如果您只是返回那个$.ajax
请求,那就是一个承诺。为什么-1
?我真的很想了解问题的质量差吗?我认为问题在于这个.nextPageUrl
<代码>此
未指向用户。如果您使用User.nextPageUrl
,您将能够在回调范围之外访问它。+1@GuilhermeOderdenge-我认为您问了一个范围很广的问题,而且很容易复制。我希望更多的问题是这样的。请不要将其删除,也不要因“驾车向下”投票而气馁。这可能是一个经常遇到的问题,但这是一个清晰的版本。@LimH。这不是范围问题。我的缺点是把它抛在脑后。不过我不会使用self
。然后你必须键入window.self
而不是简单地键入self
,因为window
是隐式的,你会隐式地覆盖它属于window
对象的可能性。天哪,它就像一个符咒!非常感谢你!但我不明白你到底做了什么你能再解释一下吗?比如,pageQueue.push(函数(nextPageUrl(){})是如何实现的
知道nextPageUrl
?我不知道这是怎么发生的。@GuilhermeOderdenge-将函数推送到一个数组中,该数组只有一个参数nextPageUrl。这意味着它需要使用传递给nextPageUrl值的变量来调用。在get函数内部,如果队列不为空,它将调用f队列中的irst函数,提供data.pagination.next_页面的值,该值将首先在函数中被接受为nextPageUrl的值。