关于Nodejs异步执行的求助
关于Nodejs异步执行的求助
格式如下: async.each(role,function(name, cb){ redisClient.get(name,function(err,roleReply){ 。。。。 }) });
async.each(dept,function(name, cb){ redisClient.get(name,function(err,deptReply){ 。。。。。 }) });
分别存在role 以及dept的数组 现根据async,循环从redis中取数据,如何实现这两个函数并行执行,而且知道他们已经执行完成??
当然可以。为了实现 role
和 dept
数组中的任务并行执行,并且能够知道所有任务都已完成,我们可以使用 async.parallel
方法。async.parallel
可以同时执行多个异步操作,并在所有操作完成后执行回调函数。
下面是具体的代码示例:
const async = require('async');
const redis = require('redis');
// 创建 Redis 客户端
const redisClient = redis.createClient({
host: '127.0.0.1',
port: 6379
});
// role 和 dept 数组
const role = ['role1', 'role2', 'role3'];
const dept = ['dept1', 'dept2', 'dept3'];
// 使用 async.parallel 并行执行 redis 请求
async.parallel([
function(callback) {
// 处理 role 数组
async.each(role, function(name, cb) {
redisClient.get(name, function(err, roleReply) {
if (err) return cb(err);
console.log(`Role ${name}:`, roleReply);
cb();
});
}, callback); // 当 role 的每个元素处理完毕时调用 callback
},
function(callback) {
// 处理 dept 数组
async.each(dept, function(name, cb) {
redisClient.get(name, function(err, deptReply) {
if (err) return cb(err);
console.log(`Dept ${name}:`, deptReply);
cb();
});
}, callback); // 当 dept 的每个元素处理完毕时调用 callback
}
], function(err) {
if (err) {
console.error('Error:', err);
return;
}
console.log('All operations completed successfully.');
redisClient.quit(); // 关闭 Redis 连接
});
解释
- 创建 Redis 客户端:首先创建一个 Redis 客户端实例,用于与 Redis 数据库通信。
- 定义角色和部门数组:定义两个数组
role
和dept
,它们包含需要查询的数据键名。 - 使用
async.parallel
:通过async.parallel
方法来并行执行两个异步操作。每个操作内部使用async.each
来遍历数组,并对每个元素执行 Redisget
操作。 - 处理结果:在每个
async.each
的回调中,我们打印出从 Redis 获取到的结果。 - 完成回调:当所有操作都完成时,
async.parallel
的最终回调会被触发,在这里可以进行清理工作,比如关闭 Redis 连接。
这样,我们就可以确保 role
和 dept
的操作是并行执行的,并且在所有操作完成后执行最后的逻辑。
如果你用 Promise:
Promise.all([
roles.map(redis.getAsync.bind(redis)),
depts.map(redis.getAsync.bind(redis))
])
.then(function(result) {
// results[0] ==> roles
// results[1] ==> depts
})
.getAsync
是 bluebird 给 redis client 自动封装的返回 promise 的函数。
function roll (nums, f) {
var count = nums;
return function () {
count--;
if (count === 0) {
f.call(null);
}
};
}
var test = function () { console.log('ok.') };
var rollInstance = roll(2, test);
async.each(role,function(name, cb){
redisClient.get(name,function(err,roleReply){
。。。。
rollInstance();
});
});
async.each(dept,function(name, cb){
redisClient.get(name,function(err,deptReply){
。。。。。
rollInstance();
});
});
能不能不通过计数的方式实现啊 ?
由于是初学者,能否再 说的仔细点呢??
async.parallel
和 async.map
可以帮上忙。 试试下面的代码,没有环境未测试,大概是这个意思。
async.parallel([
function(callback) { // task#1
async.map(role, function(name, cb) {
redisClient.get(name,function(err,roleReply){
cb(err, roleReply);
});
}, function(err, roles) {
callback(err, roles);
});
},
function(callback){ // your second task
}
],
function(err, results){
// go and play with results
});
嗯 好的 谢谢!
要实现 role
和 dept
数组中的任务并行执行,并且能够知道它们已经全部执行完成,你可以使用 async.parallel
方法。async.parallel
可以让你同时执行多个异步操作,并在所有操作完成后执行回调函数。
以下是具体的实现方式:
const async = require('async');
const redisClient = require('./path-to-your-redis-client'); // 引入Redis客户端
// 定义 role 和 dept 数组
const role = ['role1', 'role2', 'role3'];
const dept = ['dept1', 'dept2', 'dept3'];
// 使用 async.parallel 并行处理 role 和 dept 的异步操作
async.parallel([
function(callback) {
async.each(role, function(name, cb) {
redisClient.get(name, function(err, roleReply) {
if (err) return cb(err);
console.log(`Role: ${name} -> ${roleReply}`);
cb();
});
}, callback); // 触发角色处理的回调
},
function(callback) {
async.each(dept, function(name, cb) {
redisClient.get(name, function(err, deptReply) {
if (err) return cb(err);
console.log(`Dept: ${name} -> ${deptReply}`);
cb();
});
}, callback); // 触发部门处理的回调
}
], function(err) {
if (err) {
console.error('Error occurred:', err);
} else {
console.log('All operations completed successfully.');
}
});
解释
-
引入依赖:首先确保你已经安装了
async
库,并正确引用了 Redis 客户端。 -
定义数组:定义包含角色和部门名称的数组
role
和dept
。 -
使用
async.parallel
:通过async.parallel
方法将两个异步任务并行执行。每个任务都使用async.each
循环处理相应的数组,并在每个元素上执行 Redis 操作。 -
错误处理:每个
async.each
中的回调函数cb
会检查是否有错误发生。如果有错误,则调用callback
将错误传递给外部的async.parallel
回调。 -
完成后的回调:当所有并行的任务完成后,
async.parallel
的最后一个参数(在这里是匿名函数)会被调用,输出是否所有操作都成功完成的信息。
这种方式可以确保你的角色和部门的数据获取操作并发执行,并且可以在所有操作完成后得到通知。