Javascript Async方法在对象内部推送承诺,而不是值

Javascript Async方法在对象内部推送承诺,而不是值,javascript,node.js,Javascript,Node.js,有一段时间,我试图解决一个问题,并对堆栈溢出进行了研究,但似乎找不到任何能真正帮助我实现所需结果的解决方案。我试图在数组中分配一个对象数组,但没有得到值,而是得到“Promise” 我应该在我的代码中做些什么改变,这样你就可以看到价值观而不是承诺?我花了几个小时试图解决这个问题,但似乎找不到其他更好的解决方案,所以决定来这里,希望有人能指导我找到更好的解决方案,以达到预期的效果 非常感谢您的帮助。重写为使用async/await,未经测试 function groupsCollections(

有一段时间,我试图解决一个问题,并对堆栈溢出进行了研究,但似乎找不到任何能真正帮助我实现所需结果的解决方案。我试图在数组中分配一个对象数组,但没有得到值,而是得到“Promise”

我应该在我的代码中做些什么改变,这样你就可以看到价值观而不是承诺?我花了几个小时试图解决这个问题,但似乎找不到其他更好的解决方案,所以决定来这里,希望有人能指导我找到更好的解决方案,以达到预期的效果


非常感谢您的帮助。

重写为使用async/await,未经测试

function groupsCollections() {
  return new Promise((resolve, reject) => {
    mongo.connect(config.mongoURI, (err, client) => {
      if (err) return reject(err)

      const testFolder = './groupCollections'
      let files = fs.readdirSync(testFolder)
      let combine = [];
      for (let i in files) {
        let tes = fs.readdirSync(`${testFolder}/${files[i]}`)
        let ad = tes.map(el => {
          try {
            return JSON.parse(fs.readFileSync(`${testFolder}/${files[i]}/${el}`, {
              encoding: 'utf8'
            })
          } catch (err) {
            console.log('ERROR:', err)
          }
        })
        combine.push({
          groupName: files[i], collections: ad
        })
      }
      resolve(combine)
    })
  })
}

要处理
map
中的
async
函数,您需要添加
Promise。所有

async function groupsCollections() {
  mongo.connect(config.mongoURI, (err, client) => {
    if (err) {
      console.error(err);
      return;
  }
  const testFolder = "./groupCollections";
  let s = fs.readdirSync(testFolder);
  let combine = [];
  // going into each directory (Groups)
  s.forEach(async file => {
    let tes = fs.readdirSync(`${testFolder}/${file}`);
      let ad = await Promise.all(tes.map(el => readFileAsync(`${testFolder}/${file}/${el}`, {encoding: "utf8" })
        .then(text => JSON.parse(text))
        .catch(err =>  console.log("ERROR:", err)))
    );
    combine.push({ groupName: file, collections: ad });
  });
});

}

是的,
ad
是一系列承诺,因为这是您从
tes.map返回的内容。这需要完全重写。你不能把简单的回电和承诺混在一起。在第一次普通回调之后,您将无法再从
async
函数返回解析值。然后,在循环内执行异步操作,并在循环后以某种方式期望结果。除此之外,您还在某些地方使用同步文件I/O。到处都是。首先,在这里创建或获取每个异步操作的承诺版本,并使用承诺链接和
async/await
使其变得更简单。此外,您不应该在同步函数(
.map
)中使用异步函数(
readFileAsync
)。这就是你返回
[承诺]
的原因之一。我只知道我需要重写它,你能举一个例子说明我是如何做到的吗?你使用
async
关键字,但从不使用
wait
,你有同步和异步文件系统调用的组合,等等。但是无论如何,您从
.map()
调用中获得承诺数组的原因是返回到
.map()
的变量是
请参见
——它包含您调用
readFileAsync()
的承诺。对该方法使用
await
。这不使用async/await!你能澄清一下吗?你也改变了OP的意图!您已将文件读取器更改为同步版本。这不是答案@RandyCasburn it返回一个承诺:/n这不是-async/await有非常明确的语法要求。事实上,由于您使所有内容都同步,因此在这段代码中根本不需要承诺。不起作用,尝试控制台日志,但没有真正显示任何内容,但感谢您的努力,我对此表示感谢
async function groupsCollections() {
  mongo.connect(config.mongoURI, (err, client) => {
    if (err) {
      console.error(err);
      return;
  }
  const testFolder = "./groupCollections";
  let s = fs.readdirSync(testFolder);
  let combine = [];
  // going into each directory (Groups)
  s.forEach(async file => {
    let tes = fs.readdirSync(`${testFolder}/${file}`);
      let ad = await Promise.all(tes.map(el => readFileAsync(`${testFolder}/${file}/${el}`, {encoding: "utf8" })
        .then(text => JSON.parse(text))
        .catch(err =>  console.log("ERROR:", err)))
    );
    combine.push({ groupName: file, collections: ad });
  });
});