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的值。