从async function node.js返回值

g0czyy6m  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(396)

我知道这是javascript中关于函数异步行为的最常被问到的问题。我仍然无法为我的用例找到一个有效的解决方案。我要做的是使用一个键查找redis缓存。我正在使用exists函数检查密钥是否存在。如果存在,那么我将从缓存返回如果没有,那么我将设置该键,然后使用该键作为db参数进行db调用。它看起来很简单,但无论我做什么,我都无法从缓存或数据库返回值。如果我在exist函数之外进行这些调用,那么它的工作原理是解析器函数(graphql resolver)是异步函数。此解析器函数需要返回值。所以这是一段代码,我无法在任何情况下返回值scenario:-

empId: async(obj, params, ctx, resolverInfo) => {

    await client.exists(obj.empId, async function(err, reply) {
      if (reply == 1) {

        return await getAsync(obj.empId).then(res => {
          console.log(res);
          return res;

        })
      } else {
        return await db.one('SELECT * FROM iuidtest WHERE empid = $1', [obj.empId])
          .then(iuidtest => {
            console.log(iuidtest.empid);
            return iuidtest.empid;
          })

      }
    });

    const doSomethingWith = empid => {

      console.log("empid = ", empid);

    }

我正在控制台中获取正确的值,但无法返回。但是,如果我直接在解析器函数中进行这些调用,即在redis exists函数之外,我就能够返回值。

empId: async(obj, params, ctx, resolverInfo) => {
    return await getAsync(obj.empId).then(res => {
          console.log(res);
          return res;

这样我就可以从解析器函数返回值。如果有人能提供这方面的工作代码,而不是关于如何使用回调和承诺从异步函数返回的其他链接,那将是非常有帮助的。这是另一个同样的帖子redis async library没有redis library for node.js中的函数,请提前感谢!

vybvopom

vybvopom1#

如果 client.exists 返回promise,同样的代码可以写如下:

empId: async (obj, params, ctx, resolverInfo) => {

    const exists = await client.exists(obj.empId);

    if (exists === 1) {
      return getAsync(obj.empId);
    }

    return await db.one('SELECT * FROM iuidtest WHERE empid = $1', [obj.empId])
      .then(iuidtest => {
        return iuidtest.empid;
      });

  }

如果 client.exists 只接受回调,则代码可以编写为:

empId: async (obj, params, ctx, resolverInfo) => {

    async function empIdExists(empId) {

      return new Promise(function resolver(resolve, reject) {

        client.exists(obj.empId, function(err, reply) {

          if (err) {
            reject(err);
            return;
          }

          if (reply == 1) {
            resolve(1);
            return;
          } else {
            resolve(0);
            return;

          }

        })

      });

    }

    const exists = await empIdExists(obj.empId);

    if (exists === 1) {
      return getAsync(obj.empId);
    }

    return await db.one('SELECT * FROM iuidtest WHERE empid = $1', [obj.empId])
      .then(iuidtest => {
        return iuidtest.empid;
      });

  }

在第二个版本中,注意我已经 Package 了 client.exists 调用异步函数&使用 await 关键字。

相关问题