Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 主干使用回调游标获取数据_Ajax_Backbone.js_Recursion - Fatal编程技术网

Ajax 主干使用回调游标获取数据

Ajax 主干使用回调游标获取数据,ajax,backbone.js,recursion,Ajax,Backbone.js,Recursion,如何使用Backbones fetch处理包含游标的回调结果?我将使用这个简单的例子,一本获取页面的书 var Book = Backbone.Collection.extend({ model: Page, recursiveFetch: function(cursor) { this.fetch({ url: 'book/pages', data: { cursor: {cur

如何使用Backbones fetch处理包含游标的回调结果?我将使用这个简单的例子,一本获取页面的书

var Book = Backbone.Collection.extend({

    model: Page,

    recursiveFetch: function(cursor) {
        this.fetch({
            url: 'book/pages',
            data: {
                cursor: {cursor here};
            },
            success: function(response) {
               if (response.cursor) {
                   this.recursiveFetch(response.cursor);
               }
            }
        });
    }
})

我需要能够使用fetch来保持抓取,直到响应不包含游标。它应该不断添加页面模型,而不是替换和覆盖它们。它需要像上面的例子那样做,尽管我不确定实现它的最佳方法。

我认为您所需要做的就是将
{remove:false}
添加到fetch选项中。还值得一提的是,success函数的
上下文可能不是集合,因此您可能希望将其作为参数传递到success函数中。最终结果将是:

recursiveFetch: function(cursor) {
    this.fetch({
        remove:false, // prevents removal of existing models
        url: 'book/pages',
        success: function(collection, response) {
           if (response.cursor) {
               collection.recursiveFetch(response.cursor);
           }
        }
    });
}

解决方法非常简单:仅当参数存在时才将光标添加到参数中。在其他情况下(即第一次),使用其余参数发出正常请求

var CursorCollection = Backbone.Collection.extend({

  fetchAll: function(cursor) {

    var params = {
      // if you have some other request parameters...
    };

    // if we have a cursor from the previous call, add it to the parameters
    if (cursor) { params.cursor = cursor; }

    this.fetch({
      remove: false,
      data: params,
      success: function(collection, response) {
        if (response.cursor) {
          return collection.fetchAll(response.cursor);
        }
      }
    });
  }
});
然后,当您第一次调用它
collection.fetchAll()
时,它就会递归,直到它得到一个没有光标的响应为止


请注意,
remove:false
参数对于@dcarson指出的累积结果非常重要。

您的意思是集合将多次从url书籍/页面获取页面,直到响应不包含光标为止?或者集合只请求一次,您必须检查页面并将页面添加到集合中,直到它不包含游标?它将继续获取,直到响应不包含游标。最后,我在解析方法
if(!data.cursor)this.unset('cursor')中使用了它如果光标没有设置在对象上,就不要让它再次调用catch。@Josh我想这个问题已经被遗忘很久了,但我只是在破解vocab编辑器时发现了它,我有了一个解决方案。”。我应该把答案贴出来吗?@laugedelic很有趣,你碰到了这个帖子。我想我们也想出了一些更聪明的方法来处理它。但是请随意为其他可能偶然发现它的人发布您的解决方案。我尝试添加
remove:false
位,它将移动到第二个光标。之后,它将在调用同一个游标时执行无限循环。我需要了解有关游标的更多信息,以进一步提供帮助。通常还有另一个参数表示您在最后一页,它与告诉您下一页要检索的页面的参数是分开的。但这只是目前的猜测对不起,不,没有其他参数来决定最后一页。如果有光标,则有更多数据,如果没有,则应停止提取。光标看起来类似于12910298.134,将在将其作为提取参数传回时递增。简单问一下,您使用
光标
参数做什么?它已传入,但似乎并未全部使用。您不需要将其作为URL查询参数传递吗?您是对的。我更新了示例以传递包括光标在内的数据。