Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从async function node.js返回值_Javascript_Node.js_Asynchronous_Redis_Async Await - Fatal编程技术网

Javascript 从async function node.js返回值

Javascript 从async function node.js返回值,javascript,node.js,asynchronous,redis,async-await,Javascript,Node.js,Asynchronous,Redis,Async Await,我知道这是javascript中最常见的关于函数异步行为的问题。我仍然无法为我的用例找到一个有效的解决方案。 我试图做的是使用一个键查找redis缓存。我正在使用exists功能检查密钥是否存在。如果存在,则我将从缓存返回如果不存在,则我将设置该键,然后使用该键作为db参数进行db调用。这看起来很简单,但无论我做什么,我都无法从缓存或数据库返回值。如果我在exist函数之外进行这些调用,那么它的工作原理是解析器函数(graphql解析器)是一个异步函数。此解析器函数需要一个返回值。 下面是在任何

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

empId:async(obj、params、ctx、resolverInfo)=>{
wait client.exists(obj.empId,异步函数(err,reply){
如果(答复==1){
return wait getAsync(obj.empId)。然后(res=>{
控制台日志(res);
返回res;
})
}否则{
return wait db.one('SELECT*FROM iuidtest,其中empid=$1',[obj.empid])
。然后(iuidtest=>{
console.log(iuidtest.empid);
返回iuidtest.empid;
})
}
});
常量doSomethingWith=empid=>{
console.log(“empid=”,empid);

}
如果
客户端存在
返回承诺,相同的代码可以编写如下:

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.exists
调用包装到一个异步函数中,并使用
await
关键字进行调用。

await clients.exists()
仅当该函数返回承诺时才起作用。但根据您的代码,它需要回调函数,这意味着它不返回承诺,您的代码也不等待任何东西。您需要承诺客户端.exists()调用。“任何人都可以为此提供工作代码”欢迎使用Stack Overflow。请注意,这不是一个免费的编码服务。另外,请您解释一下您在其中无法理解的部分,以便其他人帮助您。@Zukerberg好的,很抱歉我错误地引用了该部分。我实际上被困在了使用exists函数的地方以及如何使用PROFECTS的部分,以便无论如何我都能够返回来自它的响应。@Chris G我尝试过promisify exists函数,但无法返回响应。我也不明白为什么可以在exist函数外部返回,但不能在它的回调函数内部返回?这正是我要找的!非常感谢。在尝试promisify时,我没有将调用包装到异步函数,然后使用wait对该异步函数进行调用。这就是为什么我认为在解析程序中返回的redis和db查找与异步相同的原因?尽管我还不清楚异步函数和承诺的用法。如果您是新手,可以建议从何处开始,这将非常有用。理解起来很简单tand.
async
函数是内部承诺函数。
async/await
是使用
promise
构造函数的同步糖。如果函数返回承诺,可以使用
await
关键字调用它。如果函数是
async
函数,即:如果前缀是
async
关键字,则可以做
。然后(…)
关于该函数调用。因此,如果您知道某个函数返回承诺,请在调用该函数时随意使用
await
关键字。这里没有更多要学习的内容。我建议您编写一些简单的承诺函数和异步函数,并以承诺和异步/等待的方式调用它们,以了解动态。