使用Node.js异步请求在Redis中进行循环
我在使用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的请求是异步的。但问题是我不知道如何使它起作用。我能怎么做 ?
-
您有两个主要问题。
-
您的
phoneNumber
变量将不是您想要的变量。可以通过更改 数组的.forEach()
或.map()
迭代来解决此问题,因为这将为当前变量创建局部函数作用域。 -
您已经创建了一种方法来知道所有异步操作何时完成。有很多重复的问题/答案显示了如何执行此操作。您可能要使用
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 });
运作方式如下:
- 调用
contacts.filter(utils.isValidNumber)
以将数组过滤为仅有效数字。 - 调用
.map()
以遍历该过滤后的数组 return db.client().get(phoneNumber)
从.map()
回调创建一个promise数组。- 获取电话号码的数据后,将该数据添加到您的自定义
contactList
对象中(这实际上是.map()
循环的副作用。 Promise.all()
在返回的promise数组上使用,以了解它们何时完成。- 使
contactList
我们建立的对象成为返回的Promise的resolve值。 - 然后,要调用它,只需使用返回的promise
.then()
即可获得最终结果。当您已经承诺可以返回时,无需添加回调参数。
-
-
使用redis的node.js:同步还是异步?
2021-02-01 关注 0 浏览128 1答案
-
在Node.JS中使用异步/等待正确请求
2021-01-31 关注 0 浏览84 1答案
-
在node.js中异步循环
2021-01-31 关注 0 浏览107 1答案
-
在node.js中异步循环
2021-02-02 关注 0 浏览99 1答案
-
使用Node.js和Redis-Node的异步编程范例
2021-02-01 关注 0 浏览181 1答案
-
在Node.js中处理异步循环的最佳模式
2021-02-01 关注 0 浏览164 1答案
-
如何在Node.js中进行此调用以同步请求?
2021-01-31 关注 0 浏览69 1答案
-
Node.js和Redis; 等待循环结束
2021-02-01 关注 0 浏览152 1答案
-
在node.js中使用异步瀑布
2021-01-31 关注 0 浏览101 1答案
-
如何使用node.js在MySQL中进行批量插入
2021-02-02 关注 0 浏览229 1答案