【发布时间】:2020-09-14 22:25:35
【问题描述】:
我是 typescript 的新手,我正在创建一些东西,但遇到了使用 javascript 时从未发生过的问题。
假设我们有 async 函数返回 Promise<ResultSet>
interface ResultSet {
status: number; // 0 for success 1 for failure
data?: any;
}
const getDataFromServer = async (parameter: string): Promise<ResultSet> => {
const response = await fetch(<--Prameters-->);
return await response.json();
}
它总是将它的值返回为Promise。
并且它需要连接到接口,以便某些模块可以使用它。它将使用上面的请求更改全局变量的值。并且需要返回动作结果(成功或失败代码)。这是在某处很多地方使用的行动的结果。
const storeData = async (parameter: string): number => {
const result = await getDataFromServer(parameter);
if (result.status == 0) {
SOME_GLOBAL_VARIABLE.setState({ data: result.data });
}
return result.status;
}
如您所料,上面的函数定义在async (parameter: string): number 附近弹出一个错误,因为函数必须返回 Promise,因为它是async 函数。
所以它需要在下面,
const storeData = async (parameter: string): Promise<number> => {
const result = await getDataFromServer(parameter);
if (result.status == 0) {
SOME_GLOBAL_VARIABLE.setState({ data: result.data });
}
return result.status;
}
问题由此开始。因为函数的返回类型是Promise,与此相关的所有其他函数的接口必须将该结果状态定义为Promise<number>,而不是number。它将全局影响整个服务器代码。
另外,SOME_GLOBAL_VARIABLE 的data 也需要输入为Promise<T>。
据我所知,没有办法将 promise 对象转换为普通对象。
我想切断这种无休止的承诺链。有什么办法吗?还是只是我的误解?即使将async ~ await 替换为then() ~ catch() 也失败了,因为它似乎也返回了Promise。
Promise 保证它的值是否成功解析。但是,在某些时候,它已经被保证为 Resolve。但是没有办法处理这种情况。
我该如何处理这种情况?使用打字稿时,这似乎很常见。但我不知道该怎么做。
【问题讨论】:
-
这似乎是对处理异步功能的误解。您如何处理
fetch的使用和后续回调不会从 JavaScript 更改为 TypeScript。在 JavaScript 和 TypeScript 中,您仍然需要awaitPromise 或使用then回调。您不需要将SOME_GLOBAL_VARIABLE的类型更改为Promise<T>,因为那是在异步部分之后,因此数据已经解析。
标签: typescript asynchronous promise