关于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中取数据,如何实现这两个函数并行执行,而且知道他们已经执行完成??


8 回复

当然可以。为了实现 roledept 数组中的任务并行执行,并且能够知道所有任务都已完成,我们可以使用 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 连接
});

解释

  1. 创建 Redis 客户端:首先创建一个 Redis 客户端实例,用于与 Redis 数据库通信。
  2. 定义角色和部门数组:定义两个数组 roledept,它们包含需要查询的数据键名。
  3. 使用 async.parallel:通过 async.parallel 方法来并行执行两个异步操作。每个操作内部使用 async.each 来遍历数组,并对每个元素执行 Redis get 操作。
  4. 处理结果:在每个 async.each 的回调中,我们打印出从 Redis 获取到的结果。
  5. 完成回调:当所有操作都完成时,async.parallel 的最终回调会被触发,在这里可以进行清理工作,比如关闭 Redis 连接。

这样,我们就可以确保 roledept 的操作是并行执行的,并且在所有操作完成后执行最后的逻辑。


如果你用 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.parallelasync.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

});

嗯 好的 谢谢!

要实现 roledept 数组中的任务并行执行,并且能够知道它们已经全部执行完成,你可以使用 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.');
    }
});

解释

  1. 引入依赖:首先确保你已经安装了 async 库,并正确引用了 Redis 客户端。

  2. 定义数组:定义包含角色和部门名称的数组 roledept

  3. 使用 async.parallel:通过 async.parallel 方法将两个异步任务并行执行。每个任务都使用 async.each 循环处理相应的数组,并在每个元素上执行 Redis 操作。

  4. 错误处理:每个 async.each 中的回调函数 cb 会检查是否有错误发生。如果有错误,则调用 callback 将错误传递给外部的 async.parallel 回调。

  5. 完成后的回调:当所有并行的任务完成后,async.parallel 的最后一个参数(在这里是匿名函数)会被调用,输出是否所有操作都成功完成的信息。

这种方式可以确保你的角色和部门的数据获取操作并发执行,并且可以在所有操作完成后得到通知。

回到顶部