nodejs async / обещание ада - PullRequest
       9

nodejs async / обещание ада

0 голосов
/ 28 января 2019

У меня есть следующая функция:

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

Я попытался изменить все функции на async / await, я попытался вернуть обещание внутри функции map в bulkPreprocess.Я пробовал обратные вызовы.Ничего не получается.

Любой совет?

1 Ответ

0 голосов
/ 28 января 2019

Вам необходимо вернуть Promise из bulkPreprocess, который разрешается после вашей асинхронной parse, поэтому вам нужно Promise.all дождаться завершения всех parse вызовов

Редактировать: Теперь объекты толкаются к bulkOps и resolve вместе с ним после того, как все 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);
};
...