为了账号安全,请及时绑定邮箱和手机立即绑定

从异步函数节点返回值.js

从异步函数节点返回值.js

慕仙森 2022-09-02 21:01:31
我知道这是javascript中关于函数异步行为的最容易被问到的问题。我仍然无法为我的用例找到一个有效的解决方案。我试图做的是使用密钥查找redis缓存。我正在使用存在函数来检查密钥是否存在。如果存在,那么我将从缓存返回,如果没有,那么我将设置密钥,然后使用此密钥作为数据库参数进行数据库调用。这似乎很简单,但无论我做什么,我都无法从缓存或数据库返回值。如果我在存在函数之外进行这些调用,那么它就像解析器函数(graphql解析器)是一个异步函数一样工作。此解析程序函数需要返回值。所以这是我无法在任何情况下重新调整值的代码:-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存在函数之外,我能够返回该值。empId: async(obj, params, ctx, resolverInfo) => {    return await getAsync(obj.empId).then(res => {          console.log(res);          return res;这样,我就能够从解析器函数返回值。如果有人能为此提供工作代码,而不是关于如何使用回调和 promise 从异步函数返回的其他链接,那将是非常有帮助的。这是另一个帖子注册相同。:- Redis 异步库没有 redis 库中的 node 函数.js提前致谢!
查看完整描述

1 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

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


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;

      });


  }

在第二个版本中,请注意,我已将调用包装到异步函数中,并使用关键字调用。client.existsawait


查看完整回答
反对 回复 2022-09-02
  • 1 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信