Javascript nodejs异步/承诺地狱
我有以下功能:Javascript nodejs异步/承诺地狱,javascript,node.js,promise,async-await,Javascript,Node.js,Promise,Async Await,我有以下功能: const bulkPreprocess = (files) => { let bulkOps = [] files.map(doc => { parse(doc).then(content => { const sent = sentiment(content) bulkOps.push(sentiment) bulkOps.push({anotherobject}) }) }) retu
const bulkPreprocess = (files) => {
let bulkOps = []
files.map(doc => {
parse(doc).then(content => {
const sent = sentiment(content)
bulkOps.push(sentiment)
bulkOps.push({anotherobject})
})
})
return bulkOps
}
由如下主函数调用:
module.exports = (req, res) => {
//parses post request with file uploads
const form = new multiparty.Form()
form.parse(req, (err, fields, allFiles) => {
//called more than once
const files = allFiles['files']
let processed = bulkPreprocess(files).then(bulk => {
console.log(bulk.length)
addToES(bulk)
})
})
res.json({ success: true })
}
我的问题是,由于bulkPreprocess调用了parse
函数(这是异步的),所以我不能让它等到所有文件都被解析后再调用addToES
。解析函数本身调用另一个异步函数(这就是为什么我必须使它异步)
整个流程如下所示:
Main->bulkPreprocess->(Parse->parseDoc)->从bulkPre->addToES返回值
我尝试将所有函数更改为async/await,我尝试在bulkPreprocess中的map
函数中返回一个承诺。我试着回电话。一切都没有结果
有什么建议吗?您需要从
bulkPreprocess
返回Promise
,它在您的异步parse
后解析,因此您需要Promise。所有等待所有parse
调用完成
const bulkPreprocess = (files) => {
let bulkOps = [];
return Promise.all(files.map(doc => {
return parse(doc).then(content => {
const sent = sentiment(content);
bulkOps.push(sentiment);
bulkOps.push({anotherobject});
});
})).then(() => bulkOps);
};
编辑:
现在,在所有的parse
完成后,它将对象推送到bulkOps
和resolve
const bulkPreprocess = (files) => {
let bulkOps = [];
return Promise.all(files.map(doc => {
return parse(doc).then(content => {
const sent = sentiment(content);
bulkOps.push(sentiment);
bulkOps.push({anotherobject});
});
})).then(() => bulkOps);
};
这不是使用.map()
的方式。在您的示例中,应该改为.forEach()
。如果您不使用它们,为什么会将其标记为async await
?为什么不使用Promise.all()
?我尝试将所有函数更改为async/await,我尝试在bulkPreprocess中的map函数中返回一个Promise-您到底尝试了什么,哪些不起作用?什么是情感
?为什么form.parse
是基于回调的?函数实际上将两个对象推送到bulkOps
。我刚刚在博文中为brevityThis拿出了一个,它仍然不止一次地调用addToES
,Promise
只有在我认为它与调用的主函数有关时才能解决(解决/拒绝)addToES@ninesalt这是可能的:)