使用节点js在父函数中使用子数据

Use child data inside parent function using node js

我想 return 一个值并将其存储在一个变量中。我不知道这是否可行,但我试过了

let demo = await Promise.all(
                    Shop.findAll({
                      where: {
                        product_id: child.id,
                      },
                      attributes: ["id", "address"],
                    })
                      .then((adds) => {
                        adds.map(async function (add) {
                          let path = add.address;
                          return path;
                        });
                      })
                      .catch(function (err) {
                        reject(err);
                      })
                  );
                  console.log(demo);

我得到的只是demo = []

New York
London
Mumbai
Sydney

我想做的是我需要父函数中的商店地址,因为 Shop 是我的子函数,所以我的实际代码如下所示

Owner.findAll({
            raw: true,
            where: {
              id: owner.id,
            },
            attributes: ["id", "name", "address"],
          })
            .then(async (children) => {

              await Promise.all(
                children.map(async function (child) {
                 let ownerName = child.name;
                 
                  let demo = await Promise.all(
                    Shop.findAll({
                      where: {
                        product_id: child.id,
                      },
                      attributes: ["id", "address"],
                    })
                      .then((adds) => {
                        adds.map(async function (add) {
                          let path = add.address;
                          return path;
                        });
                      })
                      .catch(function (err) {
                        reject(err);
                      })
                  );
                 // I want to use demo in getStatus function
                  await getStatus(ownerName,demo);
                })
              );
            })
            .catch(function (err) {
              reject(err);
            });

我想在我的所有者数据中使用商店数据

脚本中存在一组错误:

  • 缺少 returnPromise.all 没有收到任何承诺数组
  • 有不必要的 async/await 包装会增加代码的开销
  • 有一个 async 函数实际上是同步的 let path = add.address;
  • async/awaitthen/catch 链接混合使用会使代码难以阅读和理解
  • catchreject 多次

可以这样写:

let demo = await Shop.findAll({
  where: { product_id: child.id, },
  attributes: ["id", "address"],
})
  .then(adds => {
    return adds.map(toPath);
  })

function toPath(item) {
  let path = item.address;
  return path;
}

或者第二个:

return Owner.findAll({
  raw: true,
  where: {
    id: owner.id
  },
  attributes: ['id', 'name', 'address']
})
  .then((children) => {
    return Promise.all(children.map(processChild))
  })

async function processChild (child) {
  const ownerName = child.name

  const adds = await Shop.findAll({
    where: { product_id: child.id },
    attributes: ['id', 'address']
  })
  const demo = adds.map(add => add.address)

  const status = await getStatus(ownerName, demo)
  // manage the `status` or just `return getStatus(ownerName, demo)`
  return status
}

关于以下内容的通知:

.catch(function (err) {
  reject(err);
})

Shop.findAll 代码中,可能会导致多次拒绝调用,从而导致内存泄漏。 像我发布的片段一样,链接所有的承诺,让你只设置一个 catch.

因为有一个 reject 函数,我假设您将代码包装在一个 promise 中:

return new Promise((resolve, reject) => {
  Owner.findAll({...})
    .then(...)
    .catch(function (err) {
      reject(err);
    })
})

这是不必要的,因为您只需要 return Owner.findAll 的承诺 return,此代码是相同的:

return Owner.findAll({...})
    .then(...)