Node.js异步/承诺地狱

时间:2019-01-28 12:28:43

标签: 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})
    })
})
  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) -> return value from bulkPre -> addToES

我尝试将所有功能更改为异步/等待,我尝试在bulkPreprocess的map函数内部返回一个Promise。我尝试了回调。什么都没有解决。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您需要从Promise返回bulkPreprocess,它会在您的异步parse之后解析,因此您需要Promise.all等待所有parse的通话结束

编辑: 现在,在完成所有bulkOps之后,它将对象一起推入resolveparse

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);
};