gpt4 book ai didi

javascript - Node : Confusing behaviour related to saving a TypeORM model using await inside a callback/promises clearing

转载 作者:行者123 更新时间:2023-11-30 20:15:01 25 4
gpt4 key购买 nike

我正在制作一个循环遍历我所有电子邮件的系统(来自 maildir 文件夹),并且我正在使用一个名为 eml-format 的旧 NPM 包来解析每个 maildir 文件(单个电子邮件). eml-format 包不使用 promises,它只需要在读取电子邮件文件后执行回调,在该回调中,我尝试使用 将电子邮件的元数据保存到 Postgres使用 TypeORM 等待。这是我遇到问题的代码的相关部分(代码看起来有点毫无意义,因为我删除了与实际主要问题无关的所有内容)。

Maildir() 类是我的 TypeORM 模型(它指的是一个名为 maildir 的 postgres 表)。

此代码片段针对每封电子邮件循环:

/* *****************************
* START OF TOGGLEBLOCK
const md1 = new Maildir();
md1.folder = 'md1';
await db.entityManager.save(md1);
* END OF TOGGLEBLOCK
***************************** */


emlformat.read(eml, { headersOnly: false }, async (error, data) => {

console.log('before save');
const md2 = new Maildir();
md2.folder = 'md2';
await db.entityManager.save(md2);
console.log('after save');

});

按上面的代码运行时(禁用 TOGGLEBLOCK):

  • “before save”重复打印到控制台
  • await db.entityManager.save(md2); 不等待,它们似乎只是同时排队(当我在我的大约 50,000 封电子邮件的整个电子邮件帐户上运行时不好)
  • 全部排队后,全部存入数据库
  • 然后所有“保存后”消息同时打印到控制台

如果我只是启用 TOGGLEBLOCK 代码,那么回调中的 md2 await 将完全按照我的预期工作,对于每封电子邮件,它都会按顺序执行这些操作:

  • 显示一条“保存前”消息
  • 将 md2 记录保存到数据库 - await 按预期等待
  • 显示一条“保存后”消息
  • ...然后对每封电子邮件再次执行相同的操作

不需要 TOGGLEBLOCK/md1 代码,它只是我在尝试解决所有问题时放入其中的一些垃圾。为什么在回调外部有这个额外的代码会改变 md2 await 是否在回调内部工作?

我猜这与 TOGGLEBLOCK 清除 promises 或其他什么有关?

我只想完全删除垃圾 TOGGLEBLOCK/md1 代码。如果没有它,我怎样才能让 md2 await 工作?

如果您有不完全确定的建议,请将其作为答案发布,而不是直接在问题下方发表评论(多个对话交织在一起会让人感到困惑)。

最佳答案

你可以用 Promise 包装 emlformat.read 然后它可以很好地与 async/await 一起使用

const readEmlFormat = eml => new Promise(
(resolve, reject) => emlformat.read(eml, { headersOnly: false }, (error, data) => {
if (error) {
reject(error);
} else {
resolve(data);
}

}));

const data = await readEmlFormat(eml);
console.log('before save');
const md2 = new Maildir();
md2.folder = 'md2';
await db.entityManager.save(md2);
console.log('after save');

请注意,问题是您使用了异步函数作为回调,而在任何地方都没有等待!

关于javascript - Node : Confusing behaviour related to saving a TypeORM model using await inside a callback/promises clearing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52009075/

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