【问题标题】:GraphQL query returning data before node-georedis API callback completes (async issue?)GraphQL 查询在 node-georedis API 回调完成之前返回数据(异步问题?)
【发布时间】:2018-11-24 18:09:11
【问题描述】:

我正在构建一个 GraphQL API,我需要在其中访问附近的用户位置。我使用 node-georedis 库 (https://github.com/arjunmehta/node-georedis),它需要回调以获取返回数据。

我可以验证回调确实被调用并返回了正确的信息,但是当我尝试在 GraphQL 查询解析器中返回该数据时,它是未定义的。我认为这是一个异步问题,但我在搜索 stackoverflow 后尝试了各种基于 Promise、await/async 甚至是同步实现,但均未成功。

也许我忽略了范围问题?任何想法将不胜感激!

Query: {
    nearbyUsers: async (
        _,
        { input }: GQL.INearbyUsersOnQueryArguments
    ) => {
        return nearbyUsers(input.latitude, input.longitude);
    }

},



export const nearbyUsers = (latitude: Number, longitude: Number) => {
let users: any[] = [];

georedis.nearby({ latitude, longitude }, 5000, async (err: any, userIDS: any) => {

    if (err) {
        console.log(err);
    } else {
        users = await User.findByIds(userIDS);
        console.log(users); // Does indeed print proper Users
    }
});

return users; // Value is [] when returning

};

【问题讨论】:

    标签: node.js async-await graphql


    【解决方案1】:
    export const nearbyUsers = (latitude: Number, longitude: Number) => {
        return new Promise((resolve, reject) => {
            georedis.nearby({ latitude, longitude }, 5000, (err: any, userIDS: any) => {
                err ? reject(err) : resolve(userIDS);
            });
        }).then(async (userIDS) => {
            return User.findByIds(userIDS as string[]);
        }); 
    };
    

    【讨论】:

    • 这在我看来是正确的,但您可能想详细说明原始代码的问题以及您的解决方案为何有效。
    【解决方案2】:

    在这里添加来自 andrewwx10 的答案很重要的是,当调用 'georedis.nearby' 时,该函数本身有一个回调,并且 graphql 不会等到该回调完成后再继续执行最后一个 'return users; ' 行..这就是解析器返回空的原因。

    将 await 代码放在回调本身中,只是有助于控制回调本身内的流程,而不是在父/顶级代码流程中。

    因此,必须将 georedis.nearby 的调用包装到 Promise 中,这样解析器就不会在调用后继续运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 2015-01-05
      相关资源
      最近更新 更多