Node.js初学者在数组,promise和Async中苦苦挣扎

时间:2018-08-06 00:25:04

标签: arrays node.js asynchronous

这里是一个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);
    });
}

提前谢谢。

1 个答案:

答案 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中使用它。