gpt4 book ai didi

javascript - 为什么 'await' 不等待 axios 请求完成?

转载 作者:行者123 更新时间:2023-12-04 15:34:05 41 4
gpt4 key购买 nike

我尝试使用 axios 读取 HTTP 响应,并使用 stream-json 以流模式解析 JSON,这样我就可以按需完全适应我的数据库。它运作良好,但如果我尝试 关闭数据库连接一切都会崩溃,因为连接将很快关闭。
问题是:await 不会等待 extract_coins 函数完成(即使它正在返回 promise )并在最终范围内关闭数据库连接。

const main = async() => {
const dbcfg = config.get('db.coins');
const db = await coins_db_configure(dbcfg);
try {
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();

提取币:
module.exports = async function extract_coins(url, emitter){
return await axios({
method: 'get',
url: url,
responseType: 'stream'
}).then((res) => {
const pipeline = chain([
res.data,
parser(),
pick({filter: 'data'}),
streamArray()
]);
pipeline.on('data', data => {
emitter.emit('coin_extracted', data.value);
});
pipeline.on('end', () => console.log("All the coins were successfully passed!"));
});
};

最佳答案

作为与异步pipeline相关的代码没有被 promise ,您目前无法返回解决获得“结束”事件的 promise 。

您的 await确实等待 promise 解决,但您的 then回调返回 undefined ,因此在那一刻解决了 promise ,早于end事件被广播。

所以改变这个:

then((res) => {
const pipeline = chain([
res.data,
parser(),
pick({filter: 'data'}),
streamArray()
]);
pipeline.on('data', data => {
emitter.emit('coin_extracted', data.value);
});
pipeline.on('end', () => console.log("All the coins were successfully passed!"));
});

对此:
then((res) => new Promise((resolve) => {
const pipeline = chain([
res.data,
parser(),
pick({filter: 'data'}),
streamArray()
]);
pipeline.on('data', data => {
emitter.emit('coin_extracted', data.value);
});
pipeline.on('end', () => {
console.log("All the coins were successfully passed!");
resolve();
});
}));

关于javascript - 为什么 'await' 不等待 axios 请求完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60383469/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com