Gip*_*hoi 6 asynchronous promise 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();
}
Run Code Online (Sandbox Code Playgroud)
它始终将其值返回为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;
}
Run Code Online (Sandbox Code Playgroud)
正如您所期望的,上面的函数定义在附近弹出一个错误,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;
}
Run Code Online (Sandbox Code Playgroud)
问题由此开始。由于函数的返回类型是Promise,因此与此连接的所有其他函数的接口必须将该结果状态定义为Promise<number>不是number。并且它将全局影响整个服务器代码。另外,SOME_GLOBAL_VARIABLE还data需要输入为Promise<T>。
据我所知,没有办法将 Promise 对象转换为普通对象。
我想切断这种无休止的承诺链。有什么办法吗?或者这只是我的误会?即使替换async ~ await为then() ~ catch()也失败了,因为它似乎也返回了Promise。
保证Promise其值是否成功解析。但是,在某种程度上,它已经被保证为 Resolve。但这种情况没有办法处理。
我该如何处理这种情况?使用打字稿时,这似乎很常见。但我不知道该怎么办。
这与普通 JavaScript 没有什么不同,只是 TypeScript 给它起了一个名字。
简短的答案是否定的,您不能将对象的承诺转换为对象本身。这不是因为 TypeScript,而是因为 Promise API(或者异步代码的本质)。
处理 Promise / 后async / await,您可以访问 Promise 类型的唯一位置是在then处理程序内(或在 using 之后await):
// Using promises
storeData().then((result: number) => { /* result is a number here, not a promise of a number */ });
// Using async / await
const result = await storeData(); // again, result is a number, not a promise of a number
Run Code Online (Sandbox Code Playgroud)
then因此,为了避免所有代码都基于 Promise,您需要从处理程序内(或之后await)调用它:
// An example of a promise-less function somewhere in your code
const someOtherFunction = (result: number) => { /* do something with your result */ };
storeData().then(result => {
// this works since result is a number here
someOtherFunction(result);
});
Run Code Online (Sandbox Code Playgroud)
当然,您可以编写一个包装承诺的抽象,一个对象,假设有一个value等待承诺的属性,并value在解决后对其本身进行设置。然而,您仍然需要等待承诺解决才能获得解决值。
| 归档时间: |
|
| 查看次数: |
10626 次 |
| 最近记录: |