【发布时间】:2020-01-05 13:43:19
【问题描述】:
已解决,谢谢大家
编辑:
我希望我的 updateInventory 函数返回一个对象,该对象具有每个承诺的属性。
我既不知道将使用哪些,也不知道顺序
问题是t.batch 和Promise.all 返回一个索引数组,所以我不能将一个promise 关联到它的组件以输出我想要的对象。
受到post 的启发,我这样做了:
首先执行getStatement 中的then 以格式化每个promise 的结果数据:具有name 和data 属性的对象。
然后t.batch 被所有这些对象解析。结果仍然是一个索引数组,但每个对象都包含名称和数据。
所以我可以创建我的最终对象。
也许有更好的方法来做到这一点?
以下示例: 我的意见:
{
device: {
deviceId: 1,
name: "myName",
istate: "updated"
},
system: {
systemId: 50,
domain: 'foo.fr',
istate: "updated"
},
ifaces: [
{
interfaceId: 75,
name: "Iface Update 1",
istate: "updated"
},
{
name: "New Interface 1",
istate: "added"
}
]
}
“标准”输出只有 t.batch() 或 `Promise.all() : 一个索引数组
[
0: { deviceId: 1 },
1: { systemId: 50 },
2: [
{ interfaceId: 75 },
{ interfaceId: 76 }
]
]
我的自定义t.batch 输出:
[
0: { name: "device", data: { deviceId: 1 }}
1: { name: "system", data: { systemId: 50 }}
2: { name: "ifaces", data: [{ interfaceId: 75 },{ interfaceId: 76 }] }
]
然后我可以构建我的最终对象(下面的values.forEach):
{
"device": { deviceId: 1 },
"system": { systemId: 50 },
ifaces: [
{ interfaceId: 75 },
{ interfaceId: 76 }
]
}
代码(简化):
function updateInventory(params) {
const { /* hidden */, ...components } = params.data; // simplified
return Database.tx('Inventory-Update', t => { // postgres transaction with pg-promise library
const statements = []; // promise array
for(let [prop, component] of Object.entries(components)) {
statements.push(getStatement(t, prop, component));
}
return t.batch(statements);
}).then(results => {
let result = {};
results.forEach(res => {
result[res.name] = res.data;
});
return result;
});
}
function getStatement(t, prop, component) {
const repo = getReposName(prop);
const state = component.istate;
let statement;
switch(state) {
case "updated":
statement = t[repo].update(component);
break;
case "removed":
statement = t[repo].delete(component);
break;
default:
statement = t[repo].insert(component);
break;
}
return statement.then(res => {
return {name: prop, data: res };
});
}
【问题讨论】:
-
用行号来说话是非常困难的。请提供一个最小的示例以及什么不起作用。
-
@Vishnudev,最后的评论没有意义。调用
then不会让代码等待。此外,它不会影响statement的值。 -
从
t[repo]开始的一些代码看起来有问题,这会导致调用上下文丢失。应该只传入t,然后在里面做t.repo。然后尝试两次解决承诺 - 一次在事务函数中,在调用t.batch时,另一次在getStatement中。 -
如果
statement在你的getStatement中是Promise(似乎是这种情况),那么输出(承诺数组)是正确的