【问题标题】:How to return value from callback in Graphql resolve function?如何从 Graphql 解析函数中的回调返回值?
【发布时间】: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(),
      },
    }),
  }),

【问题讨论】:

    标签: javascript graphql relayjs relay graphql-js


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-28
      • 2018-02-13
      • 2019-07-25
      • 2017-05-13
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多