我从未完全理解如果需要部分描述。
.fetchAll()
获取给定的Parse.Object列表。
.fetchAllIfNeeded()
获取给定的Parse.Object 列表(如果需要)。
我可能会使用这种情况以及确切需要什么的情况是什么?我觉得这是一种超级基本的东西,但我还没有找到一个令人满意和清晰的定义。
在API的示例中,我注意到fetchAllIfNeeded()
有:
// Objects were fetched and updated.
成功时fetchAll
只有:
// All the objects were fetched.
那么fetchAllIfNeeded()
也可以保存东西吗?这里很困惑。
更新
TEST 1
在评论中留下@danh的一些提示,我尝试了以下内容。
var todos = [];
var x = new Todo({content:'Test A'}); // Parse.Object
todos.push(x);
x.save();
// So now we have a todo saved to parse and x has an id. Async assumed.
x.set({content:'Test B'});
Parse.Object.fetchAllIfNeeded(todos);
因此,在这种情况下,我的客户端x
与服务器不同。但是x.hasChanged()
是错误的,因为我们使用了set
函数并且触发了更改事件。 fetchAllIfNeeded
不会返回任何结果。因此,它并没有尝试将此直接与服务器上要同步和获取的内容进行比较。
我注意到在请求有效负载中,运行fetchAllIfNeeded
正在发送以下有趣的东西。
{where: {objectId: {$in: []}}, _method: "GET",…}
所以似乎在客户端上某些东西决定了一个对象是否需要
测试2
所以现在,基于这些评论,我试图通过静默设置来操纵对象的changed
状态。
x.set({content:'Test C'}, {silent:true});
x.hasChanged(); // true
Parse.Object.fetchAllIfNeeded(todos);
仍然没什么有趣的。显然,服务器状态("测试A")与客户端不同("测试C")。我的结果仍为[]
,请求有效负载为:
{where: {objectId: {$in: []}}, _method: "GET",…}
更新2
通过查看Parse源来计算它。见答案。
答案 0 :(得分:9)
经过多次操作,然后看一下来源 - 我想出来了。基本上fetchAllIfNeeded
将获取没有数据的数组中的模型,这意味着没有属性属性和值。
所以用例就是让你说一个带有嵌套Parse对象数组的父对象。获取父对象时,将不包括数组中的嵌套子对象(除非您设置了include
查询约束)。相反,指针被发送回客户端,在客户端,这些指针被转换为没有数据的“空”模型,基本上只是带有ID的空白Parse.Objects。
具体来说,Parse.Object有一个名为_hasData
的内部布尔属性,它似乎在任何时候都会切换为true,例如set,fetch或者给出该模型属性的任何东西。
因此,假设您需要获取这些子对象。你可以做一些像
这样的事情var childObjects = parent.get('children'); // Array
Parse.Object.fetchAllIfNeeded(childObjects);
它将搜索当前仅表示为具有id的空对象的那些孩子。
与fetchAll
相比,它是有用的,你可以通过子数组并根据需要懒洋洋地加载一个,然后在以后需要“得到其余的”。 fetchAllIfNeeded
基本上只是过滤“其余”并发送一个whereIn查询,该查询将获取限制为那些没有数据的子对象。
在Parse文档中,他们对fetchAllIfNeeded
的回调响应中有一条评论:
// Objects were fetched and UPDATED.
我认为它们意味着客户端对象已更新。 fetchAllIfNeeded
肯定会发送GET调用,所以我怀疑服务器端有什么更新。所以这不是一些同步功能。这让我很困惑,因为当他们真正意味着我立即想到服务器端更新时:
// Client objects were fetched and updated.