当前位置: 首页 > 面试题库 >

使用Node.js异步请求在Redis中进行循环

沈飞跃
2023-03-14
问题内容

我在使用redis和nodejs时遇到问题。我必须遍历电话号码列表,并检查我的Redis数据库中是否存在该号码。这是我的代码:

function getContactList(contacts, callback) {
  var contactList = {};

  for(var i = 0; i < contacts.length; i++) {
    var phoneNumber = contacts[i];

    if(utils.isValidNumber(phoneNumber)) {

      db.client().get(phoneNumber).then(function(reply) {
        console.log("before");
        contactList[phoneNumber] = reply;
      });
    }
  }

  console.log("after");
  callback(contactList);

};

“之后”控制台日志出现在“之前”控制台日志之前,并且回调始终返回一个empty
contactList。这是因为如果我很了解,对redis的请求是异步的。但问题是我不知道如何使它起作用。我能怎么做 ?


问题答案:

您有两个主要问题。

  1. 您的phoneNumber变量将不是您想要的变量。可以通过更改 数组的.forEach().map()迭代来解决此问题,因为这将为当前变量创建局部函数作用域。

  2. 您已经创建了一种方法来知道所有异步操作何时完成。有很多重复的问题/答案显示了如何执行此操作。您可能要使用Promise.all()

我建议这种解决方案利用您已经拥有的承诺:

function getContactList(contacts) {
    var contactList = {};
    return Promise.all(contacts.filter(utils.isValidNumber).map(function(phoneNumber) {
        return db.client().get(phoneNumber).then(function(reply) {
            // build custom object
            constactList[phoneNumber] = reply;
        });
    })).then(function() {
        // make contactList be the resolve value
        return contactList;
    });
}

getContactList.then(function(contactList) {
    // use the contactList here
}, funtion(err) {
    // process errors here
});

运作方式如下:

  1. 调用contacts.filter(utils.isValidNumber)以将数组过滤为仅有效数字。
  2. 调用.map()以遍历该过滤后的数组
  3. return db.client().get(phoneNumber).map()回调创建一个promise数组。
  4. 获取电话号码的数据后,将该数据添加到您的自定义contactList对象中(这实际上是.map()循环的副作用。
  5. Promise.all()在返回的promise数组上使用,以了解它们何时完成。
  6. 使contactList我们建立的对象成为返回的Promise的resolve值。
  7. 然后,要调用它,只需使用返回的promise .then()即可获得最终结果。当您已经承诺可以返回时,无需添加回调参数。


 类似资料:
  • 问题内容: 我是这个Node.js的新手..我对此回调有点困惑..在我的应用程序中,我在for循环内调用异步函数调用,我想我的问题是在得到异步调用响应之前, for循环被循环。 我的代码: 搜索功能代码: 我想在成功执行1个搜索功能后执行for循环,我想我必须使用async for loop。请指导我解决此问题。 问题答案: 我将您的代码示例简化为以下几行,以使您更容易理解该概念。 先前代码的问题

  • 问题内容: 在我的程序中,我从另一个API模块调用了我的函数: 模块代码: 执行立即返回,但是,并因此包含请求对象和请求体- 样,不需要响应体。 我做错了什么?怎么修?正确的用法是什么,或仅与此处提到的Promise一起正确使用:为什么await对于节点请求模块不起作用?以下文章提到了可能的方法:在Node.js中掌握Async Await 。 问题答案: 您需要使用模块,而不是模块或。 对返回p

  • 问题内容: 我的nodejs应用程序中有一个名为get_source_at的函数。它以uri作为参数,其目的是从该uri返回源代码。我的问题是我不知道如何使函数同步调用请求,而不是给它提供回调函数。我 希望 控制流暂停几秒钟以加载uri。我该如何实现? 另外,我已经阅读了有关“事件”以及如何“事件化”节点的知识,在编写代码时应该尊重这一点。我很乐意这样做,但是在继续执行应用程序的控制流程之前,我必

  • 问题内容: 我有一个PHP脚本,需要从远程服务器下载多个文件。目前,我只有一个循环使用cURL下载和处理文件,这意味着它直到下一个文件完成后才开始下载一个文件- 这大大增加了脚本的运行时间。 是否可以启动多个cURL实例,例如,同时异步下载这些文件而无需等待上一个实例完成?如果是这样,将如何实现? 问题答案: 是。 有一个multirequest PHP库 (或参见:已归档的Google Code

  • 问题内容: 在我的应用程序(node / express / redis)中,我使用一些代码同时更新数据库中的多个项目: 我可以确定在方法返回之前将执行所有这些操作吗?我关心的是异步处理。由于我不在db操作中使用回调函数,因此可以吗? 问题答案: 使用MULTI / EXEC命令创建命令队列并连续执行它们。然后使用回调发送回连贯的响应(成功/失败)。请注意,您必须使用Redis的AOF来避免这种情

  • 问题内容: 我想根据多个ajax / json请求的结果来更新页面。使用jQuery,我可以“链接”回调,例如以下非常简单的示例: 但是,这导致请求是串行发出的。我宁愿以一种并行方式发出请求,并在完成所有操作后执行页面更新的方法。有什么办法吗? 问题答案: 尝试以下解决方案,该解决方案可以支持任意数量的并行查询: