英文:
Finally block is running before Promise.all() finished
问题
以下是代码的翻译部分:
我正在编写一个用于填充我的数据库的脚本,但在重建函数完成之前,我的 node-pg 连接被终止时出现问题。
const rebuildDB = async () => {
try {
client.connect();
await dropTables();
await createTables();
await Promise.all(employees.map(createEmployee), customers.map(createCustomer));
} catch (err) {
console.log(err);
} finally {
client.end();
}
};
rebuildDB();
当我移除 finally
块时,一切都正常运行。如果保留它,createEmployee
函数将执行,但在 createCustomer()
能够执行之前连接将被终止。
有任何建议吗?
英文:
I'm working on a script to seed my database but am having issues with my node-pg connection being terminated before my rebuild function is finished.
const rebuildDB = async () => {
try {
client.connect();
await dropTables();
await createTables();
await Promise.all(employees.map(createEmployee), customers.map(createCustomer));
} catch (err) {
console.log(err);
} finally {
client.end();
}
};
rebuildDB();
When I remove the finally block everything runs correctly. If i leave it, the createEmployee function will execute but the connection will be terminated before createCustomer() is able to execute.
Any suggestions?
答案1
得分: 1
以下是您要翻译的部分:
"Reposting my comment as a proper answer (and adding to it):
There are two issues. The main one, which you asked about, is that you're calling Promise.all
incorrectly. It accepts only a single argument, not multiple arguments, so it's ignoring the promises from the second argument entirely. You want to pass in a single iterable (probably an array in this case).
The other problem is that you don't want client.connect()
inside the try
, since you don't want to call client.end()
if client.connect()
throws.
So:
const rebuildDB = async () => {
// This shouldn't be *inside* the `try`, since you don't want to call
// `client.end()` if this fails
client.connect(); // <=== Does this need an await? It doesn't have one in your question...
try {
await dropTables();
await createTables();
// Pass a single array to `Promise.all`
await Promise.all([...employees.map(createEmployee), ...customers.map(createCustomer)]);
} catch (err) {
console.log(err);
} finally {
client.end();
}
};
rebuildDB();
英文:
Reposting my comment as a proper answer (and adding to it):
There are two issues. The main one, which you asked about, is that you're calling Promise.all
incorrectly. It accepts only a single argument, not multiple arguments, so it's ignoring the promises from the second argument entirely. You want to pass in a single iterable (probably an array in this case).
The other problem is that you don't want client.connect()
inside the try
, since you don't want to call client.end()
if client.connect()
throws.
So:
const rebuildDB = async () => {
// This shouldn't be *inside* the `try`, since you don't want to call
// `client.end()` if this fails
client.connect(); // <=== Does this need an await? It doesn't have one in your question...
try {
await dropTables();
await createTables();
// Pass a single array to `Promise.all`
await Promise.all([...employees.map(createEmployee), ...customers.map(createCustomer)]);
} catch (err) {
console.log(err);
} finally {
client.end();
}
};
rebuildDB();
答案2
得分: 0
你可以将你的两个Promise数组连接起来,以获得一个预期的可迭代参数。
await Promise.all(
employees.map(createEmployee)
.concat(
customers.map(createCustomer)
)
);
这在结果上等同于其他答案中提到的展开运算符。然而,如果你的数组非常大(我假设它们可能是从数据库中获取的所有条目),展开运算符可能会引发Maximum call stack size exceeded
错误。对于大数组,特别是如果你只有两个数组要合并,使用concat
更有效率。
了解更多信息,请访问 https://www.educative.io/answers/spread-operator-vs-arrayprototypeconcat-in-javascript
英文:
You can concat your two promises arrays in order to have the one expected iterable argument
await Promise.all(
employees.map(createEmployee)
.concat(
customers.map(createCustomer)
)
);
This is equivalent in terms of result with the spread operator given in other answers. However if your arrays are very large (and I assume they could be if they are all the entries from a db) the spread operator could throw a Maximum call stack size exceeded
error. Concat is more efficient on large arrays, especially if you only have two arrays to merge.
Read more about this on https://www.educative.io/answers/spread-operator-vs-arrayprototypeconcat-in-javascript
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论