18 条回复  ·  2066 次点击
galenjiang 初学 2025-2-2 19:37:23
@llej Suspense 不就是可以实现异步吗?只是不是语言层面的 algebraic effects ,能力有限。 前端很容易陷入用 react 等框架的实现来理解编程,可以多看一下其他语言的做法。 或者看一下 js 的 metadata, https://www.typescriptlang.org/docs/handbook/decorators.html#metadata ,很多框架用了这个能力。
llej 楼主 小成 2025-2-2 19:51:44
@galenjiang 你可以看下我 4 楼和八楼的回复,另外你的说法我是认可的
llej 楼主 小成 2025-2-2 20:04:23
@galenjiang 另外 metadata 还有装饰器这些东西我总感觉有点画蛇添足
galenjiang 初学 2025-2-2 20:32:18
@llej 我不太懂,为什么不能用 setTimeout 中使用 inject ,我好久没写了,印象中好像是可以的。还有为什么 useConfig 很难,异步你可以把它作为一个函数 cont useConfig=()=>inject("getConfig"), const getConfig = useConfig(); const config = getConfig()不就好了嘛, 或者 config 直接是一个 promise 都可以 。 meta data 是很优雅的,https://angular.dev/guide/di/dependency-injection#injecting-consuming-a-dependency ,其实它和 inject 可以是等价的。
llej 楼主 小成 2025-2-2 20:38:48
@galenjiang 不是说 useConfig 很难,而是说这样组合起来到处随便用很难,他只能在组件创建的时候用。 setTimeou 以及请求等异步调用的回掉中是不能使用 inject 的,因为异步执行的时候他没法判断是在那个组件的调用栈中,进而无法找到对应组件树提供的值
llej 楼主 小成 2025-2-2 20:41:05
@galenjiang 你说的这个异步解决办法是有效的,但这就导致了你的 useConfig 无法被随意组合了,因为组合后又需要像这样包裹一层来调用,等于有了某种传染性
hedwi 小成 2025-2-2 20:52:43
angular 用户路过 依赖注入很强大
galenjiang 初学 2025-2-2 21:06:40
@llej 我大概明白了,vue 其实是在生成实例时把,把当前实例存在全局变量中,异步是没法通过 getCurrentInstance 访问这个变量的,所以 inject 是依赖 setup ,但是 setup 并没有显式声明这个 this ,所以这里 inject 破坏了依赖注入,使用了一个外部变量 解决的办法是重写 function inject(key, defaultValue) { let instance = getCurrentInstance(); // 获取当前组件实例 while (instance) { if (instance.provides && key in instance.provides) { return instance.provides[key]; // 找到并返回 } instance = instance.parent; // 继续向上查找 } return defaultValue; // 未找到,返回默认值 }把 getCurrentInstance 作为一个参数变量传入,而不是直接用全局变量。
llej 楼主 小成 2025-2-2 21:12:06
@galenjiang 是的,你描述的比我清晰多了,所以这样最后还是绕回了显式传递参数
12
返回顶部