[英]How are objects handled in JS async programming? Impact of delete-function
我对 JS 有疑问,希望有人能提供帮助。
我的目标是:创建一个 object,其中包含 api 的多个端点的数据。
我的问题:当我控制台记录整个 object 时,Promise 中的函数生成的所有属性都丢失了。 当我尝试通过它的属性直接访问它时。 查看浏览器输出以更好地理解...
这怎么可能奏效?
var tickets = (await app.$api.get('/ticket')).data.result;
var promisses = [];
for (const key in tickets) {
promisses.push(Promise.all([
app.$api.get(`ticket/${tickets[key].id}/file`).then(response => {tickets[key].files = response.data.result; console.log("X")}),
app.$api.get(`ticket/${tickets[key].id}/field`).then(response => {tickets[key].fields = response.data.result}),
app.$api.get(`ticket/${tickets[key].id}/group`).then(response => {tickets[key].groups = response.data.result}),
app.$api.get(`ticket/${tickets[key].id}/user`).then(response => {tickets[key].users = response.data.result}),
app.$api.get(`ticket/${tickets[key].id}/work`).then(response => {tickets[key].work = response.data.result}),
app.$api.get(`ticket/${tickets[key].id}/sign`).then(response => {tickets[key].signs = response.data.result}),
]));
}
await Promise.all(promisses);
console.log(tickets[0]);
console.log(tickets[0].fields);
编辑:所有属性,不仅是字段属性受到影响。
也许我找到了解决方案,但没有找到答案。
在代码片段之后执行的 function 中,使用了delete ticket.fields 。 删除 function 会在执行之前影响执行吗?
以下代码片段正在工作:原始代码包含删除功能......
function validateTicket(ticket) {
if (ticket.fields) {
ticket.fields.forEach(validateTicketField);
// delete ticket.fields;
} else throw new Error('MISSING_PARAMETER(fields)');
if (ticket.files) {
ticket.files.forEach(validateTicketFile);
// delete ticket.files;
} else throw new Error('MISSING_PARAMETER(files)');
if (ticket.groups) {
ticket.groups.forEach(validateTicketGroup);
// delete ticket.groups;
} else throw new Error('MISSING_PARAMETER(groups)');
if (ticket.users) {
ticket.users.forEach(validateTicketUser);
// delete ticket.users;
} else throw new Error('MISSING_PARAMETER(users)');
if (ticket.work) {
ticket.work.forEach(validateTicketWork);
// delete ticket.work;
} else throw new Error('MISSING_PARAMETER(work)');
if (ticket.signs) {
ticket.signs.forEach(validateTicketSign);
// delete ticket.signs;
} else throw new Error('MISSING_PARAMETER(signs)');
// TODO: check Ticket Headdata
}
var tickets = (await app.$api.get('/ticket')).data.result;
var promisses = [];
for (const key in tickets) {
promisses.push(...[
app.$api.get(`ticket/${tickets[key].id}/file`).then(response => {tickets[key].files = response.data.result; console.log("X")}),
app.$api.get(`ticket/${tickets[key].id}/field`).then(response => {tickets[key].fields = response.data.result}),
app.$api.get(`ticket/${tickets[key].id}/group`).then(response => {tickets[key].groups = response.data.result}),
app.$api.get(`ticket/${tickets[key].id}/user`).then(response => {tickets[key].users = response.data.result}),
app.$api.get(`ticket/${tickets[key].id}/work`).then(response => {tickets[key].work = response.data.result}),
app.$api.get(`ticket/${tickets[key].id}/sign`).then(response => {tickets[key].signs = response.data.result}),
]);
}
await Promise.all(promisses);
console.log(tickets[0]);
console.log(tickets[0].fields);
tickets.forEach(validateTicket);
检查这个 stackoverflow.com/a/62548305/9695286。 在 console.log 中记录 object。 但它只会在您展开 object 值时检索并显示所有属性。 – 卡兰
我将重新发布 Karan 的这个答案作为解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.