fetchAllIfNeeded与JS SDK中的fetchAll有何不同?

时间:2015-04-16 00:41:40

标签: parse-platform

我从未完全理解如果需要部分描述。

.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源来计算它。见答案。

1 个答案:

答案 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.