这里是一个node.js(和一般的编码)初学者,他们在苦苦挣扎着节点的异步特性。我正在尝试按照下面的“ getMembers”函数编写一些代码,这些代码将查找某些AD组的成员并将成员名称添加到数组中。我只对计算机对象感兴趣,这就是为什么我只有ad.find返回“其他”对象的原因。
一旦完成,我希望“ processAssets”函数对数组做一些事情-为了进行测试,只需对console.log进行操作即可。问题是“ processAssets”在“ getMembers”已填充阵列之前正在运行。我究竟做错了什么?我意识到答案可能始于“几件事” ...!
const ActiveDirectory = require('activedirectory');
var ad = new ActiveDirectory(config);
var query = 'memberOf=cn=';
var cNames = [
'group1',
'group2',
'group3'
];
var baseOu = ',ou=Groups,dc=example,dc=com';
function run(cNames) {
Promise.all(cNames.map(cName => getMembers(cName))).then(processAssets())
}
async function getMembers(cName) {
await ad.find(query + cName + baseOu, async function(err, results) {
if ((err) || (! results)) {return;}
await _.each(results.other, function(other) {
assetArray.push(other.cn);
});
});
}
function processAssets() {
console.log("Contents of assetArray (" + assetArray.length + " assets):");
assetArray.forEach(function(item) {
console.log(item);
});
}
提前谢谢。
答案 0 :(得分:0)
您有些混乱。
引起您直接问题的主要问题是此行:
Promise.all(cNames.map(cName => getMembers(cName))).then(processAssets())
您需要将一个函数传递给then()
,当承诺解决时将调用该函数。您没有这样做,而是将调用processAssets()
的结果传递给它,这具有立即调用processAssets()
的效果。通常,您会给我们类似的东西:
Promise.all(cNames.map(cName => getMembers(cName))).then(() => processAssets())
/* ^^ pass a function */
此外,您是await
毫无目的的事物。没有理由在这里等待:
await ad.find(query + cName + baseOu, async function(err, results) {
ad.find
不返回承诺。在一般情况下,使用回调的函数不会返回承诺(也许有一些例外,但我想不到)。如果您希望在run()
的{{1}}中使用诺言,则需要将Promise.all
函数包装在诺言中并返回。像这样:
find
现在function getMembers(cName) {
return new Promise((resolve, reject) => {
ad.find(query + cName + baseOu, function(err, results) {
if (err) return reject(err)
// I'm making some assumptions about results. But hopefully this gives
// a good enough idea
let data = results.other.map(other => other.cn)
resolve(data)
});
});
}
返回一个承诺,该承诺可以解决getMembers
的结果,您可以在`Promise.all中使用它。