Mat*_*att 2 javascript asynchronous node.js async-await knex.js
我有以下异步函数来复制名为“调查问卷”的 postgres 数据库表中的记录:
const duplicateQuestionnaire = async(trx, originalQuestionnaireId) => {
const originalQuestionnaire = await trx
.select("*")
.from("Questionnaires")
.where({
id: originalQuestionnaireId
})
.then(head);
const newQuestionnaireId = await trx
.table("Questionnaires")
.insert(omit(originalQuestionnaire, "id"))
.returning("id")
.then(head);
const sectionIDs = await trx
.select("id")
.from("Sections")
.where({
QuestionnaireId: originalQuestionnaireId
});
sectionIDs.map(element => {
duplicateSection(trx, element.id, newQuestionnaireId);
});
return trx
.select("*")
.from("Questionnaires")
.where({
id: newQuestionnaireId
})
.then(head);
};Run Code Online (Sandbox Code Playgroud)
复制后,它将调用第二个异步函数来复制名为“Sections”的表中的记录:
const duplicateSection = async (trx, sectionId, newQuestionnaireId) => {
const originalSection = await trx
.select("*")
.from("Sections")
.where({ id: sectionId })
.then(head);
const newSection = omit(originalSection, "id");
newQuestionnaireId ? (newSection.QuestionnaireId = newQuestionnaireId) : null;
const newSectionId = await trx
.table("Sections")
.insert(newSection)
.returning("id")
.then(head);
return trx
.select("*")
.from("Sections")
.where({ id: newSectionId })
.then(head);
};Run Code Online (Sandbox Code Playgroud)
这些功能在设计时考虑了层次结构:作为调查问卷的
duplicateQuestionnaire调用duplicateSection包含部分。可以在不调用前一个函数的情况下调用后一个函数,并且不会将其作为其操作的一部分进行调用。每个函数的返回值用作 GraphQL 返回。
这些函数都对数据库产生了预期的效果;他们工作。但是,duplicateQuestionnaire正在标记此错误:
(node:172) UnhandledPromiseRejectionWarning: Error: Transaction query already complete, run with DEBUG=knex:tx for more info
web_1 | at completedError (/app/node_modules/knex/lib/transaction.js:303:9)
web_1 | at /app/node_modules/knex/lib/transaction.js:277:22
web_1 | From previous event:
web_1 | at Client_PG.trxClient.query (/app/node_modules/knex/lib/transaction.js:275:34)
web_1 | at Runner.<anonymous> (/app/node_modules/knex/lib/runner.js:155:36)
web_1 | From previous event:
web_1 | at /app/node_modules/knex/lib/runner.js:61:21
web_1 | at runCallback (timers.js:810:20)
web_1 | at tryOnImmediate (timers.js:768:5)
web_1 | at processImmediate [as _immediateCallback] (timers.js:745:5)
web_1 | From previous event:
web_1 | at Runner.run (/app/node_modules/knex/lib/runner.js:47:31)
web_1 | at Builder.Target.then (/app/node_modules/knex/lib/interface.js:39:43)
web_1 | at duplicateSection (/app/repositories/DuplicateRepository.js:49:6)
web_1 | at <anonymous>
web_1 | (node:172) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
web_1 | (node:172) [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.Run Code Online (Sandbox Code Playgroud)
我知道问题在于我如何处理每个duplicateSection呼叫.map(),但是经过一些研究和大量的谷歌搜索,我仍然在努力解决它。
您想要await重复部分返回的所有承诺:
await Promise.all(sectionIDs.map(element =>
duplicateSection(trx, element.id, newQuestionnaireId)
));
Run Code Online (Sandbox Code Playgroud)
这不仅可以确保在运行最终查询之前复制所有部分,还可以链接拒绝的承诺。
| 归档时间: |
|
| 查看次数: |
1998 次 |
| 最近记录: |