是否可以在没有异步/等待的情况下从诺言中返回已解决的值?

时间:2019-06-16 08:24:59

标签: javascript node.js asynchronous async-await apollo

我正在关注阿波罗教程(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()

此代码使我感到困惑。如何运作?

1 个答案:

答案 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或不存在最终会导致相同的行为。