gpt4 book ai didi

node.js - promise 运行 then() 但不返回正确的数据

转载 作者:太空宇宙 更新时间:2023-11-04 03:15:07 25 4
gpt4 key购买 nike

已解答,谢谢大家

编辑:我想要我的updateInventory函数返回一个对象,该对象具有每个 promise 的属性。我既不知道将使用哪些,也不知道顺序问题是t.batchPromise.all返回一个索引数组,因此我无法将 promise 与其组件关联起来以输出我想要的对象。

受到此启发post我这样做了:

thengetStatement首先执行以格式化每个 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 };
});
}

最佳答案

它基于 Promise 的工作原理。 then 表示 Promise 解决后,将运行下一部分。但是,您可以将多个 then 添加到单个 Promise 中,并且它们不会相互影响。

在此示例中,您可以看到 Promise all 在 then 语句之前解析(因为它只是等待语句完成,而不是 waitABit 部分)。

function getStatement() {
const statement = waitABit();

statement.then(res => {
let foo={name: Math.random(), data: [Math.random()] };
console.log(foo);
return foo;
});
return statement;
}

async function waitABit() {
return new Promise(resolve => setTimeout(resolve,1000));
}

async function callAll() {
statements = [];
for (let i=0; i < 3; i++){
statements.push(getStatement());
}
console.log(await Promise.all(statements));
}

callAll();

这部分很容易修复:

    function getStatement() {
let statement = waitABit();

const afterStatement = statement.then(res => {
let foo={name: Math.random(), data: [Math.random()] };
console.log(foo);
return foo;
});
return afterStatement;
}

async function waitABit() {
return new Promise(resolve => setTimeout(resolve,1000));
}

async function callAll() {
statements = [];
for (let i=0; i < 3; i++){
statements.push(getStatement());
}
console.log(await Promise.all(statements));
}

callAll();

但在您的情况下,它可能也不是一个选择,因为之后您会将用 namdata 解决的 promise 放入 t.batch(statements); 中,这可能会失败。

您需要以不同的方式处理这个问题 - 即 getStatement 将返回数据库中的这些更新以及您需要的数据的数据结构,然后您等待数据更新,然后继续下一步。

关于node.js - promise 运行 then() 但不返回正确的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57758312/

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