如何从 Graphql 解析函数中的回调返回值?

Posted

技术标签:

【中文标题】如何从 Graphql 解析函数中的回调返回值?【英文标题】:How to return value from callback in Graphql resolve function? 【发布时间】:2017-11-01 19:18:35 【问题描述】:

如何从回调函数返回值并将其传递给 Graphql 中的解析函数?

这里是展示这个概念的虚拟代码:

这个函数运行sql查询:

function runQuery(query, cb)
   ....
   var value = "Something";
   cb(null, value);

这会将回调函数中的值传递给graphql中的解析函数:

function getTitle() 
   return runQuery("...", function(err, value) 
             return value; 
          );

Graphql 架构:

var SampleType = new GraphQLObjectType(
  name: 'Sample',
  fields: () => (
    title:  type: GraphQLString ,
  ),
);


query: new GraphQLObjectType(
    name: 'Query',
    fields: () => (
      sample: 
        type: SampleType,
        resolve: () => getTitle(),
      ,
    ),
  ),

【问题讨论】:

【参考方案1】:

基本上,您可以围绕该 runQuery 创建一个承诺,以便在使用查询数据时可以使用异步等待

const getTitle = () => 
    return new Promise((resolve, reject) => 
       runQuery("...", (error, response) => !error
           ? resolve(response)
           : reject(error))
    )


const asyncFunction = async () => 
    const data = await getTitle()
        .then((response) => 
            // handle response and return what you want
            return response.data
        )
        .catch((error) => 
            // handle error, log it, etc, in whatever way you want
            console.log(error.message)
            return null
        )
    if(data)  // data is valid
        // do what you want with the valid data (no error)
     else  // there was an error
        // handle if there is an error
    


asyncFunction()

【讨论】:

可以通过添加有关此代码 sn-p 如何回答问题的说明来改进此答案。【参考方案2】:

您可以使用 Promise 和 async 来完成此操作。

async function getTitle() 
  const queryResult = await runQuery("...");

  // ...
  // Do post-query stuff here that you currently have in your callback
  // ...

  return queryResult


async function runQuery() 
  const value = 'something';
  // ...
  return value;

节点fully supports async/await as of 7.10.0。如果您在浏览器中或被锁定在较低版本的节点中,请使用 TypeScript 或 Babel。

【讨论】:

以上是关于如何从 Graphql 解析函数中的回调返回值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 type-graphql 解析器函数获取 graphql 后端中的选定字段?

从javascript中的回调函数返回值? [复制]

如何从matlab中用户定义的函数返回一个值,该函数的回调在uicontrol中指定

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

如何在 Laravel Rebing GraphQL 中使用“隐私”属性函数?

如何解决 graphql 查询中的嵌套项