Javascript 如何干净地提取Parse.Object关系';在获取对象时,是否记录?

Javascript 如何干净地提取Parse.Object关系';在获取对象时,是否记录?,javascript,parse-platform,Javascript,Parse Platform,在《解析JavaScript指南》中,关于它的主题指出 默认情况下,在获取对象时,相关的Parse.Objects不是 取来。这些对象的值只有在 我被带走了 它们还指出,当Parse.Object上存在关系字段时,必须使用该关系的query().find()方法。文档中提供的示例: var user = Parse.User.current(); var relation = user.relation("likes"); relation.query().find({ success: f

在《解析JavaScript指南》中,关于它的主题指出

默认情况下,在获取对象时,相关的Parse.Objects不是 取来。这些对象的值只有在 我被带走了

它们还指出,当
Parse.Object
上存在
关系
字段时,必须使用该关系的
query().find()
方法。文档中提供的示例:

var user = Parse.User.current();
var relation = user.relation("likes");
relation.query().find({
  success: function(list) {
    // list contains the posts that the current user likes.
  }
});
我理解这在SDK设计方面是一件好事,因为它可以防止不必要地获取数百条相关记录。只获取您目前需要的数据

但是,在我的例子中,我知道永远不会有超过10条相关记录被提取的时候。我希望每次都能获取这些记录,因为它们将在视图中呈现


通过扩展
Parse.Object
Parse.Object
Parse结合使用时,是否有一种更简洁的方法来封装此功能。Promise
是关键

当扩展
Parse.Object
始终检索关系的对象时,我们可能会重写
fetch
方法

例如,让我们考虑下面的例子,在这里我们要检索一篇文章及其评论(假设这是发生在一个想要显示文章及其评论的视图中):

如果每次我们想得到一篇帖子和它的评论时都要这样做,那会变得非常重复和令人厌烦。而且,我们不会枯燥,每次复制和粘贴15行代码

因此,让我们通过扩展
Parse.Object
并重写其
fetch
函数来封装它,如下所示:

/*
  models/post.js
*/

window.myApp = window.myApp || {};

window.myApp.Post = Parse.Object.extend("Post", {
  fetch: function(options) {
    var _arguments = arguments;
    this.commentsQuery = this.relation("comments").query();
    return this.commentsQuery.find({
      success: (function(_this) {
        return function(comments) {
          return _this.comments = comments;
        };
      })(this)
    }).always((function(_this) {
      return function() {
        return _this.constructor.__super__.fetch.apply(_this, _arguments);
      };
    })(this));
  }
});
免责声明:为了全面了解上述内容的工作原理,您必须真正了解如何和如何工作,但以下是在现有的
帖子上调用fetch时,在描述性级别上会发生的情况:

  • 尝试检索帖子的评论,并将其设置为帖子的
    评论
    属性
  • 无论上述操作的结果如何(无论是否失败),始终执行post的默认获取操作,并调用该操作的所有回调

  • 您是否尝试过使用include(“likes”)

    我对JavaScript API的熟悉程度不如ObjC API。。因此,在下面的示例中,我不确定“objectId”是否是您需要使用的实际键名

    var user = Parse.User.current();
    var query = new Parse.Query(Parse.User);
    query.equalTo(objectId, user.objectId);
    query.include("likes")
    query.find({
      success: function(user) {
        // Do stuff
      }
    });
    
    总的来说,你要考虑改变你的关系。我不确定向用户对象添加自定义值是否是个好主意。考虑创建一个类似的类型,让它指向用户

    解析文档中的示例:

    var query=newparse.query(注释);
    //检索最新的
    query.descending(“createdAt”);
    //只取最后十个
    查询.限额(10);
    //在每条评论中包含帖子数据
    查询。包括(“后”);
    查询.查找({
    成功:功能(评论){
    //注释现在包含最后十条注释和“post”字段
    //已填充。例如:
    对于(var i=0;i
    哦,太好了。然而,同样有很多代码需要重复。您认为有可能修改我的解决方案以优雅地使用
    include
    ?完全欢迎您的建议:)为什么您认为在您的案例用户和my case Post对象中添加自定义值是个坏主意?因为我们最终可能会对这些应用程序调用
    save
    ,这可能会对内部SDK造成严重破坏,和/或产生不正确解析数据的意外后果?感谢您的枯燥建议,每个程序员都应该为此着迷。
    var user = Parse.User.current();
    var query = new Parse.Query(Parse.User);
    query.equalTo(objectId, user.objectId);
    query.include("likes")
    query.find({
      success: function(user) {
        // Do stuff
      }
    });
    
    var query = new Parse.Query(Comment);
    
    // Retrieve the most recent ones
    query.descending("createdAt");
    
    // Only retrieve the last ten
    query.limit(10);
    
    // Include the post data with each comment
    query.include("post");
    
    query.find({
      success: function(comments) {
        // Comments now contains the last ten comments, and the "post" field
        // has been populated. For example:
        for (var i = 0; i < comments.length; i++) {
          // This does not require a network access.
          var post = comments[i].get("post");
        }
      }
    });