我正在关注阿波罗教程(https://www.apollographql.com/docs/tutorial/resolvers/),并且看到了以下代码:
me: async (_, __, { dataSources }) =>
dataSources.userAPI.findOrCreateUser()
我认为dataSources.userAPI.findOrCreateUser()
返回承诺
await dataSources.userAPI.findOrCreateUser()
是正确的。
但是它运行良好,没有任何错误,我在React中得到了解决的价值……即使下面的代码也运行良好。
me: (_, __, { dataSources }) =>
dataSources.userAPI.findOrCreateUser()
此代码使我感到困惑。如何运作?
答案 0 :(得分:1)
除了启用await
之外,async
implicitly wraps还将函数结果转换为Promise.resolve()
。大概是:
async function() {
return something;
}
等效于:
function() {
return Promise.resolve(something);
}
事物是Promise.resolve()
“展平”其参数,这意味着,如果其参数是 thenable (例如另一个Promise),它将自动对其进行“解析”。换句话说,Promise.resolve(somethingThatIsAPromise).then(<work>)
具有与somethingThatIsAPromise.then(<work>)
相同的效果。
MDN tries to explain that behavior(粗体是我的):
Promise.resolve()
方法返回一个已解决的Promise
对象 具有给定的值。 如果价值是一个承诺,那么那个承诺就是 返回;如果该值是可以接受的(即具有"then
" method),则 返回的承诺将“遵循” ,然后采用最终的承诺 州;否则,返回的承诺将通过 值。此功能展平嵌套类似诺言的对象的嵌套层 (例如,解决了某个问题的承诺后的承诺) 成单层。
而且,由于箭头函数返回的内容(dataSources.userAPI.findOrCreateUser()
是一个承诺,由于这种“扁平化”,具有async
或不存在最终会导致相同的行为。