Arrays Node.js初学者正在与数组、承诺和异步进行斗争

Arrays Node.js初学者正在与数组、承诺和异步进行斗争,arrays,node.js,asynchronous,Arrays,Node.js,Asynchronous,这里是node.js(一般来说是编码)的初学者,正在努力解决node的异步特性。我正在尝试编写一些代码,根据下面的“getMembers”函数查找某些广告组的成员,并将成员名称添加到数组中。我只对计算机对象感兴趣,这就是为什么我只有ad.find返回“其他”对象 完成后,我希望“processAssets”函数对数组进行一些处理——出于测试目的,只需输出到console.log即可。问题是“processAssets”在“getMembers”填充数组之前运行。我做错了什么?我意识到答案可能从“

这里是node.js(一般来说是编码)的初学者,正在努力解决node的异步特性。我正在尝试编写一些代码,根据下面的“getMembers”函数查找某些广告组的成员,并将成员名称添加到数组中。我只对计算机对象感兴趣,这就是为什么我只有ad.find返回“其他”对象

完成后,我希望“processAssets”函数对数组进行一些处理——出于测试目的,只需输出到console.log即可。问题是“processAssets”在“getMembers”填充数组之前运行。我做错了什么?我意识到答案可能从“几件事”开始


提前谢谢。

你有些事情搞混了

导致您立即出现问题的主要问题是这一行:

Promise.all(cNames.map(cName => getMembers(cName))).then(processAssets())
您需要将一个函数传递给
then()
,该函数将在承诺解析时调用。您没有这样做,而是将调用
processAssets()
的结果传递给它,该结果具有立即调用
processAssets()
的效果。通常情况下,您会告诉我们:

Promise.all(cNames.map(cName => getMembers(cName))).then(() => processAssets())
/*                                                       ^^ pass a function  */
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)
      });
  });  
}
此外,你在毫无目的地等待事物。没有理由在这里等待:

 await ad.find(query + cName + baseOu, async function(err, results) {
ad.find
不返回承诺。一般来说,接受回调的函数不会返回承诺(可能有一些例外,但我想不出任何例外)。如果希望在
run()
promise中使用promise。所有的
都需要将
find
函数包装在promise中并返回它。比如:

Promise.all(cNames.map(cName => getMembers(cName))).then(() => processAssets())
/*                                                       ^^ pass a function  */
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
返回一个解析为
ad.find
结果的承诺,您可以在`promise.all.

中使用它。您确定
.find
返回一个
承诺吗?它看起来是基于回调的。我应该提到我使用的是activedirectory包,而不是直接使用ad。我已经更新了问题以使其更清楚。那么,你确定
.find
返回了
承诺吗?不,我不确定-正如我所说,我是一个初学者,尽管研究了这个网站和其他网站,但我觉得我错过了一些基本的东西。