JavaScript async await doesn't work inside forEach loop

匿名 (未验证) 提交于 2019-12-03 01:39:01

问题:

I have few queries to a database which I want to gather into a transaction.

let t = await db.sequelize.transaction()   try {     let adr = await addressRepo.add(address, t)     let user = await userRepo.add(email, password, name, surname, phone, NIP, REGON, id_number, adr.id, t)     await userRoleRepo.add(user.id, user_role, t)     if (languages != null) {       languages.forEach(async function (language) {         await userLanguageRepo.add(user.id, language.id, language.main, t)       })     }     await t.commit()     res.status(201).json(user)   } catch (error) {     await t.rollback() } 

According to above code, the transaction is created and all queries are included except of those in forEach loop. As a result I get:

Executing (fb270893-9146-43b7-a35e-8960ea386513): START TRANSACTION; Executing (fb270893-9146-43b7-a35e-8960ea386513): INSERT INTO `address` (`id`,`country`) VALUES (DEFAULT,'country'); Executing (fb270893-9146-43b7-a35e-8960ea386513): INSERT INTO `user` (`id`,`email`,`password`,`name`,`surname`,`active`,`address_id`,`created_at`,`updated_at`) VALUES (DEFAULT,'a15','$2a$10$7uImQNl0T12CZLUB0Asxwu8yCGUa/eZnbr8TATX8V/tnnO8erdYzy','John','Dee','0',15,'2017-08-28 07:44:03','2017-08-28 07:44:03'); Executing (fb270893-9146-43b7-a35e-8960ea386513): INSERT INTO `user_role` (`user_id`,`role_id`) VALUES (7,1); Executing (fb270893-9146-43b7-a35e-8960ea386513): COMMIT; (node:5873) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: commit has been called on this transaction(fb270893-9146-43b7-a35e-8960ea386513), you can no longer use it. (The rejected query is attached as the 'sql' property of this error) (node:5873) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. (node:5873) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: commit has been called on this transaction(fb270893-9146-43b7-a35e-8960ea386513), you can no longer use it. (The rejected query is attached as the 'sql' property of this error) 

I looked at async commit is execute before forEach loop. How can I execute forEach loop before commit?

回答1:

Instead of forEach one should use for of loop.

I found the answer at this post.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!