【问题标题】:Nodejs Array is always empty, while it should be filledNodejs 数组总是空的,而它应该被填充
【发布时间】:2021-08-03 03:57:04
【问题描述】:
const generatePropertyAmenities = async (property) => {
  let result = [];
  property.amenities.map(async (res, key) => {
    /**
     * Get the amenities type id, creates it if it doesn't exist
     * const type_existed_before: defines if the type already existed
     */
    let type_id = null;
    const type_existed_before = await strapi
      .query("amenities-categories")
      .findOne({ name: res.type.trim() });
    if (type_existed_before) type_id = type_existed_before.id;
    else
      type_id = await strapi
        .query("amenities-categories")
        .create({ name: res.type }).id;

    res.items.map(async (amenity) => {
      const amenity_exists = await strapi
        .query("amenities")
        .findOne({ name: amenity.name.trim() });
      if (amenity_exists) {
        // console.log(amenity_exists)
        if (
          !type_existed_before ||
          (type_existed_before &&
            !amenity_exists.amenities_categories.find((x) => x === type_id))
        ) {
          await strapi.query("amenities").update(
            { id: amenity_exists.id },
            {
              amenities_categories: [
                ...amenity_exists.amenities_categories,
                type_id,
              ],
            }
          );
        }
        result = [...result, amenity_exists.id];
      } else {
        result = [
          ...result,
          await strapi
            .query("amenities")
            .create({
              name: amenity.name.trim(),
              amenities_categories: [type_id],
            }).id,
        ];
      }
    });
  });
  console.log(result);
  return result;
};

结果总是空的,我在这里遗漏了什么吗?我真的不明白我做错了什么。我检查了所有内容,amenity_exists.id 是正确的,一切似乎都是正确的,但有些东西不是我真的需要一些帮助

【问题讨论】:

标签: javascript node.js arrays


【解决方案1】:

好的,所以我设法让它工作,我想我无法解释它为什么以及如何工作我可能需要你们的一些解释,但这是我的解决方案:

const generatePropertyAmenities = async (property) => {

  const getAmenityCategoryId = (item) =>
    new Promise(async (resolve, reject) => {
      const type_existed_before = await strapi
        .query("amenities-categories")
        .findOne({ name: item.type.trim() });
      if (type_existed_before)
        resolve({
          type_id: type_existed_before.id,
          type_existed_before: false,
        });
      else
        resolve({
          type_id: await strapi
            .query("amenities-categories")
            .create({ name: item.type }).id,
          type_existed_before: false,
        });
    });

  const getAmenity = (amenity, type_id, type_existed_before) =>
    new Promise(async (resolve, reject) => {
      const amenity_exists = await strapi
        .query("amenities")
        .findOne({ name: amenity.name.trim() });
      if (amenity_exists) {
        // console.log(amenity_exists)
        if (
          !type_existed_before ||
          (type_existed_before &&
            !amenity_exists.amenities_categories.find((x) => x === type_id))
        ) {
          await strapi.query("amenities").update(
            { id: amenity_exists.id },
            {
              amenities_categories: [
                ...amenity_exists.amenities_categories,
                type_id,
              ],
            }
          );
        }
        resolve(amenity_exists.id);
      } else {
        resolve(
          await strapi.query("amenities").create({
            name: amenity.name.trim(),
            amenities_categories: [type_id],
          }).id
        );
      }
    });

  const createArrayOfAmenities = () =>
    new Promise(async (resolve, reject) => {
      let ret = [];
      for (let index = 0; index < property.amenities.length; index++) {
        const element = property.amenities[index];
        let { type_id, type_existed_before } = await getAmenityCategoryId(
          element
        );
        for (let k = 0; k < element.items.length; k++) {
          const amenity = element.items[k];
          ret = [
            ...ret,
            await getAmenity(amenity, type_id, type_existed_before),
          ];
        }
      }
      resolve(ret)
    });

  return await createArrayOfAmenities();
};

【讨论】:

    【解决方案2】:

    试试

    await res.items.map(async ...
    

    【讨论】:

    • 这不会改变任何事情。
    • 我已经尝试过了,但我认为这里的主要问题是我缺少对 js 逻辑的理解
    • 这不会改变任何事情。
    • 我认为其中一个异步 fn 正在破坏它
    • 您应该将函数分解为具有不同职责的单独异步 fns,以使其更具可读性和易于调试
    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多