gpt4 book ai didi

mobx - 在 mobx-state-tree 中异步加载引用的数据

转载 作者:行者123 更新时间:2023-12-04 13:39:52 34 4
gpt4 key购买 nike

我已经查看了 mobx-state-tree 文档甚至测试文件 https://github.com/mobxjs/mobx-state-tree/blob/master/packages/mobx-state-tree/tests/core/reference-custom.test.ts#L148
弄清楚如何从异步源填充引用节点。例如,user1 被加载并引用 user2,但 user2 不在树中,所以去获取 user2 并加载它。过去我让所有用户都提前加载,所以 types.late() 工作得很好。但是我在加载时间开始时停止加载所有用户,而是只想加载正在引用的用户数据。

这是一个示例片段。我实际上并没有让这个例子在沙箱中工作,因为我正在寻求你们好人的指导帮助,了解在哪里以及如何异步获取丢失的节点背后的逻辑。您会注意到,在创建商店时加载的两个用户引用了尚未加载的第三个用户。当 MST 使用前两个用户填充树并遇到对未加载用户 ID 的引用时,我们如何使其获取用户,然后将其添加到用户映射中?

export const User = types
.model("User", {
id: types.identifier,
name: types.string,
friends: types.array(types.late(types.reference(User)))
})
.preProcessSnapshot(snapshot => {
if (snapshot){
return({
id: snapshot.id,
name: snapshot.name,
friends: snapshot.friends
})
}
})

export const UserStore = types
.model("UserStore", {
users: types.map(User),
})
.actions( self => ({
fetchUser: flow(function* (userId) {
let returnThis
try {
returnThis = yield ajaxFetchUser(userId)
self.users.put(returnThis)
} catch (error) {
console.log(error)
}
return self.users.get(returnThis.id)
})
}))

UserStore.create({
users:[{
id: 1,
name: "Justin",
friends: ["2","3"]
},{
id: 2,
name: "Jack",
friends: ["1","3"]
}]
})

const ajaxFetchUser = (userId) => {
// pretend that userId is 3
setTimeout(()=>{
return {
id:3,
name: "John",
friends: ["1","2"]
}
}, 3000)
}

当然,我使用的脚本比此代码复杂得多,具有适当的 map.put 和 map.get 操作。

如果有人可以对这个主题有所了解,我非常感激。

最佳答案

您可以尝试拦截试图访问特定属性(在您的案例引用中)的人,方法是将其转换为 getter(基本上是创建 View )并从那里安排操作(数据获取)。我知道看起来您在那里违反了某些内容(并且您确实违反了),但这就是您所追求的。我认为这就是 MobX 在幕后运作的方式,也许它违反了最佳实践的事实促使其作者转而使用代理。嗯...你可能想试试 Proxy也。

关于mobx - 在 mobx-state-tree 中异步加载引用的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59160404/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com