【问题标题】:Redis Javascript Async FunctionRedis Javascript 异步函数
【发布时间】:2018-09-19 18:12:38
【问题描述】:

我有一个 ID 数组,我需要获取每个 ID 的详细信息。

我目前有这个。

const redis = require('redis');

const redisClient = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_HOST);

const arrayList = [
  { id: 3444 },
  { id: 3555 },
  { id: 543666 },
  { id: 12333 },
];

async function getDetails(element) {
  await redisClient.hgetall(element.id, (err, user) => {
    if (err) {
      console.log('Something went wrong');
      // Handle Error
      return err;
    }
    console.log('Done for User');
    return user;
  });
}


arrayList.forEach((element) => {
  console.log('element');
  await getDetails(element).then((res) => {
    // Do Something with response for each element
  });
});

这是我现在得到的回应。它不是异步的。请问我做错了什么。

element
element
element
element
Done for User
Done for User
Done for User
Done for User

【问题讨论】:

    标签: javascript arrays node.js asynchronous redis


    【解决方案1】:

    所以在 async/await 中事情是如何进行的,您创建了一个异步函数,并在该函数中等待其他操作完成。您无需等待即可调用该异步函数,或者将其(func 调用)包装在另一个异步函数中。

    arrayList.forEach((element) => {
      console.log('element');
      let returnedPromise= getDetails(element);
      console.log("Promise after getDetails function", returnedPromise);
    });
    

    此代码更改应该可以解决错误。

    【讨论】:

      【解决方案2】:

      Array.forEach() 在移动到下一个项目之前不会等待承诺执行。

      您可以改为在异步函数中使用 for 循环,如下所示:

      async function main() {
        for (const element of arrayList) {
          const response = await getDetails(element);
          // do something with reponse for each element
        }
      }
      
      main()
        .then(() => /* on success */)
        .catch((err) => /* on error */);
      

      【讨论】:

        猜你喜欢
        • 2017-08-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-25
        • 2014-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多