繁体   English   中英

JS 异步编程中如何处理对象? 删除功能的影响

[英]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);

浏览器输出:使用 Microsoft Edge、Chrome、Firefox 测试

编辑:所有属性,不仅是字段属性受到影响。

也许我找到了解决方案,但没有找到答案。

在代码片段之后执行的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM