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)
这段代码让我很困惑。它是如何工作的?
除了启用之外await
,async
还将函数的结果隐式包装到一个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
无论是否具有相同的行为。
归档时间: |
|
查看次数: |
3572 次 |
最近记录: |