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