是否可以在没有 async/await 的情况下从 promise 返回已解析的值?

den*_*nse -1 javascript asynchronous node.js async-await apollo

我正在关注阿波罗教程(https://www.apollographql.com/docs/tutorial/resolvers/),我看到了这个代码:

me: async (_, __, { dataSources }) =>
  dataSources.userAPI.findOrCreateUser()
Run Code Online (Sandbox Code Playgroud)

因为dataSources.userAPI.findOrCreateUser()返回Promise,我认为这await dataSources.userAPI.findOrCreateUser()是对的。

但是它运行得非常好,没有任何错误,我在 React 中得到了解决的价值……即使是下面的代码也运行得很好。

me: (_, __, { dataSources }) =>
  dataSources.userAPI.findOrCreateUser()
Run Code Online (Sandbox Code Playgroud)

这段代码让我很困惑。它是如何工作的?

acd*_*ior 9

除了启用之外awaitasync 还将函数的结果隐式包装到一个Promise.resolve(). 大致:

async function() {
  return something;
}
Run Code Online (Sandbox Code Playgroud)

相当于:

function() {
  return Promise.resolve(something);
}
Run Code Online (Sandbox Code Playgroud)

事物是Promise.resolve()“扁平化”它的参数,这意味着如果它的参数是一个thenable(例如另一个 Promise),它会自动“解析”它。换句话说,Promise.resolve(somethingThatIsAPromise).then(<work>)具有相同的效果somethingThatIsAPromise.then(<work>)

MDN 试图解释这种行为(粗体是我的):

Promise.resolve()方法返回一个Promise用给定值解析的对象。如果值是一个承诺,则返回该承诺;如果值是 thenable(即有一个then”方法),则返回的承诺将“跟随”那个 thenable,采用其最终状态;否则返回的承诺将用该值实现。该函数将嵌套的类承诺对象层(例如,解析为解析为某事的承诺的承诺)扁平化为单个层。

而且,由于您的箭头函数返回的 ( dataSources.userAPI.findOrCreateUser()) 是一个 Promise,由于这种“扁平化”,async无论是否具有相同的行为。