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这是可能的:)