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

jmk*_*142 5 parse-platform

我从来没有完全理解描述中需要的部分.

.fetchAll() 获取给定的Parse.Object列表.

.fetchAllIfNeeded()如果需要, 获取给定的Parse.Object列表.

在什么情况下我可能会使用它以及究竟是什么决定了需求?我觉得这是超级基本的东西,但我找不到一个令人满意和清晰的定义.

在API的示例中,我注意到fetchAllIfNeeded():

// Objects were fetched and updated.
Run Code Online (Sandbox Code Playgroud)

在成功的同时fetchAll只有:

// All the objects were fetched.
Run Code Online (Sandbox Code Playgroud)

那么fetchAllIfNeeded()节省的东西也是如此吗?这里很困惑.

更新

测试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);
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,我的客户端x与服务器不同.但是x.hasChanged()因为我们使用了set函数并且触发了change事件,所以它是错误的.fetchAllIfNeeded没有结果.因此,它并不是试图将这与服务器上的同步和提取进行比较.

我注意到在请求有效负载中,运行fetchAllIfNeeded正在发送以下有趣的东西.

{where: {objectId: {$in: []}}, _method: "GET",…}
Run Code Online (Sandbox Code Playgroud)

所以似乎在客户端上的某些东西决定了一个对象是否是必需的

测试2

所以现在,根据评论,我尝试changed通过设置静默来操纵对象的状态.

x.set({content:'Test C'}, {silent:true});
x.hasChanged(); // true
Parse.Object.fetchAllIfNeeded(todos);
Run Code Online (Sandbox Code Playgroud)

仍然没有什么有趣 显然,服务器状态("测试A")与客户端("测试C")不同.我仍然结果[],请求有效负载是:

{where: {objectId: {$in: []}}, _method: "GET",…}
Run Code Online (Sandbox Code Playgroud)

更新2

通过查看Parse源找出它.见答案.

jmk*_*142 9

经过多次操作,然后看看源头 - 我想出来了.基本上fetchAllIfNeeded将获取没有数据的数组中的模型,这意味着没有属性属性和值.

所以用例就是让你说一个带有嵌套Parse对象数组的父对象.获取父对象时,将不包括数组中的嵌套子对象(除非您设置了include查询约束).相反,指针被发送回客户端,在客户端,这些指针被转换为没有数据的"空"模型,基本上只是带有ids的空白Parse.Objects.

具体来说,Parse.Object有一个内部的布尔属性_hasData,在任何时候像set,fetch或者其他什么东西给出那个模型属性时,它似乎都被切换为true.

所以,假设您需要获取这些子对象.你可以做点什么

var childObjects = parent.get('children'); // Array
Parse.Object.fetchAllIfNeeded(childObjects);
Run Code Online (Sandbox Code Playgroud)

它将搜索那些当前仅表示为具有id的空对象的子项.

它是有用的,而不是fetchAll你可能会通过子数组并根据需要懒洋洋地加载一个,然后在以后需要"得到其余的".fetchAllIfNeeded实质上只是过滤"其余"并发送一个whereIn查询,该查询将获取限制为那些没有数据的子对象.

在Parse文档中,他们在回调响应中有一个注释fetchAllIfNeeded:

// Objects were fetched and UPDATED.
Run Code Online (Sandbox Code Playgroud)

我认为它们意味着客户端对象已更新.fetchAllIfNeeded肯定是发送GET调用所以我怀疑服务器端的任何更新.所以这不是一些同步功能.这让我很困惑,因为当他们真正意味着我立即想到服务器端更新:

// Client objects were fetched and updated.
Run Code Online (Sandbox Code Playgroud)