从 Promise 中解构响应

Posted

技术标签:

【中文标题】从 Promise 中解构响应【英文标题】:Destructuring Response from a Promise 【发布时间】:2020-12-04 06:15:27 【问题描述】:

我正在深入研究承诺并试图实现这样的目标。我有异步功能的地方。

async function myFunc(): Promise< data: any > 
    return new Promise((resolve, reject) => 
        resolve( data:  item: "test"  )
    );

我想这样使用它:

const data = myFunc();

基本上就像 useQuery 在 apollo 客户端中的工作方式一样。

有什么方法可以做到这一点吗?我猜我已经偏离轨道了。我知道您可以使用 then 或 catch,但我特别希望遵循 useQuery 之类的模式。

【问题讨论】:

由于myFunc(); 返回一个promise,你需要await 它来获取promise 解析的值。 await 只能在异步函数中使用。或者,您可以使用.then()。兑现你的承诺 【参考方案1】:

您可以像这样在 async 函数中这样做:

const  data  = await myFunc();

或在非async 函数中这样:

myFunc()
.then((data) => 
    // ...
)
// .catch here, probably

正如旁注一样,没有理由将函数显示为async。如果您在函数中使用 await 并希望它自动创建基于函数内发生的事情解决的承诺,则只需要在函数上使用 async。在您的函数中,您不使用await,而是显式地创建了promise。 (但这可能只是一个占位符......)

【讨论】:

太快了...我只是在写那个:) 好的,这是有道理的。也许我问错了问题。我这样做是因为两个主要因素/假设:1) myFunc 的真正实现在其中调用了一个异步的第 3 方模块,因此我认为我需要使 myFunc 异步。 2) myFunc 将在反应组件中调用,因此使其“等待”会导致问题。 @user1148920 - 其中任何一个都可能是其自身的问题。 :-) 但是 FWIW:1) 如果 3rd 方模块的函数返回一个 promise,并且您想在调用它时使用 await,则您的函数需要为 async。或者你可以使用 promise 的 .then/.catch。如果第 3 方函数是回调式的,最好在非async 函数中使用new Promise。 2) 如果处理正确,可以在 React 中使用 asyncawait不管叫什么)。 HTH! :-)

以上是关于从 Promise 中解构响应的主要内容,如果未能解决你的问题,请参考以下文章

我期望从 API 响应中接收一组对象,但在使用 TypeScript 的 React 中获得一组 Promise

如何从fetch获取响应值而不是没有值的promise?

ES6 面向对象 promise

如何使用 fetch 从 Promise 回调中返回返回值? [复制]

async/await 函数中的 JavaScript Promise 解析最终响应数组

从 Promise 返回数据到 GraphQL