На самом деле, вы использовали ES6 + способом, но не обычным способом, это вызывает эту проблему, но, безусловно, использование await
вместе с then
является именно ошибкой, вы должны написать их так, как показано ниже коды:
const main = async () => {
try {
const dbcfg = config.get('db.coins');
const db = await coins_db_configure(dbcfg);
console.log('Connected to the database and created coins table!');
await extract_coins('some_url_which_gives_correct_json', coins_emitter);
} catch (e) {
console.error(e);
} finally {
await db.close();
}
};
main();
Как видите, я поместил все коды в блок try
, потому что использование async/await
означает, что мы притворяемся, что пишем код syn c, но фактически это async
, поэтому мы должны поместить все коды, особенно асинхронные строки, в блок try
. после помещения их в блок try
только из-за флага async
, стоящего за ()
JavaScript, интерпретатор ожидает завершения каждой строки до sh, если в каждой строке есть ошибка, следующие строки не будут выполняться, и интерпретатор попадет в Блок catch
, наконец, работает во всех случаях, как вы сейчас.
Хорошо, теперь вернемся к основной проблеме, функция extract_coins
:
export default (async function extract_coins(url, emitter) {
try {
const res = await axios({
method: 'get',
url: url,
responseType: 'stream'
});
const pipeline = chain([
res.data,
parser(),
pick({filter: 'data'}),
streamArray()
]);
await pipeline.on('data', data => {
emitter.emit('coin_extracted', data.value);
});
await pipeline.on('end', () => console.log("All the coins were successfully passed!"));
// HERE: return what you want
} catch (e) {
throw e;
}
});
Это является причиной проблемы, вы должны передать обещание функции extract_coins
с новым методом EcmaScript, не используя функции обратного вызова.
Если я зайду на вашем месте, я напишу extract_coins
, как показано ниже:
const extract_coins = async (url, emitter) => {
try {
const res = await axios({
method: 'get',
url: url,
responseType: 'stream'
});
const pipeline = chain([
res.data,
parser(),
pick({filter: 'data'}),
streamArray()
]);
await pipeline.on('data', data => {
emitter.emit('coin_extracted', data.value);
});
await pipeline.on('end', () => console.log("All the coins were successfully passed!"));
// HERE: return what you want
} catch (e) {
throw e;
}
};
export default extract_coins;