GraphQL查询在node-georedis API回调完成之前返回数据(异步问题?)

时间:2018-06-14 21:46:32

标签: node.js async-await graphql

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

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

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

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

};

2 个答案:

答案 0 :(得分: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[]);
    }); 
};

答案 1 :(得分:0)

在此处添加来自andrewwx10的答案的重要之处在于,当调用'georedis.nearby'时,该函数本身具有回调,并且graphql不会等到完成回调之后再继续执行最后的“返回用户”; '。这就是解析器返回空的原因。

将等待代码放入回调本身中,仅有助于控制回调本身中的流,但此处不包括父级/顶级代码流中的

由于这个原因,必须将 georedis。的发票包装到Promise中,以便解析器不会在调用之后继续进行。