activedirectory2 findUsers回调问题:missingPostList为空的原因及解决
问题原因与修复方案
核心原因
这是异步回调执行顺序导致的问题:
ad.findUsers是异步方法,它的回调函数不会立即执行,要等AD查询操作完成后才会触发- 外层的
console.log(missingPostList)是同步代码,会在所有ad.findUsers的回调执行前就运行,所以此时missingPostList还是空数组 - 开启
console.log时你能看到结果,是因为浏览器/Node.js的控制台有延迟解析特性:它显示的是数组最终的状态,而非console.log执行瞬间的状态,但实际上执行console.log那一刻数组仍是空的
修复方案
方案1:Promise封装+async/await(顺序执行)
把异步回调转换成Promise形式,配合async/await确保每个查询完成后再执行下一步:
import ActiveDirectory from 'activedirectory2'; // ... 保留原有config等初始化代码 // 封装findUsers为Promise方法 const findUsersAsync = (query) => { return new Promise((resolve, reject) => { ad.findUsers(query, (err, users) => { if (err) reject(err); else resolve(users); }); }); }; let missingPostList = []; let ad = new ActiveDirectory(config); let staffUtil = new StaffUtil(); let staffList = await staffUtil.getStaffList(); // 用for...of循环配合await for (const staff of staffList) { let query = "title=" + staff.post; try { const users = await findUsersAsync(query); if (!users || users.length === 0) { missingPostList.push(staff.post); } else { // ... 保留原有存在用户时的逻辑 } } catch (err) { console.log('ERROR: ' + JSON.stringify(err)); } } console.log(missingPostList); // 此时所有查询已完成,数组内容正确
方案2:Promise.all(并行执行,效率更高)
如果不需要严格的查询顺序,用Promise.all并行处理所有查询,提升执行效率:
import ActiveDirectory from 'activedirectory2'; // ... 保留原有config等初始化代码 const findUsersAsync = (query) => { return new Promise((resolve, reject) => { ad.findUsers(query, (err, users) => { if (err) reject(err); else resolve(users); }); }); }; let missingPostList = []; let ad = new ActiveDirectory(config); let staffUtil = new StaffUtil(); let staffList = await staffUtil.getStaffList(); // 生成所有查询的Promise数组 const queryPromises = staffList.map(async (staff) => { const query = "title=" + staff.post; try { const users = await findUsersAsync(query); // 存在用户返回null,缺失则返回职位名称 return (!users || users.length === 0) ? staff.post : null; } catch (err) { console.log('ERROR: ' + JSON.stringify(err)); return null; } }); // 等待所有查询完成,过滤掉null值得到缺失职位列表 const results = await Promise.all(queryPromises); missingPostList = results.filter(item => item !== null); console.log(missingPostList); // 此时所有查询完成,数组内容正确
内容的提问来源于stack exchange,提问作者The KNVB
相关产品推荐
相关产品推荐

