在 .map 中使用 `await` 可以,但似乎跳过了父级的 `await` 功能[重复]

问题描述 投票:0回答:2

我有一个 rss.xml.js 文件,它使用 astro 框架在项目中运行此脚本。

import rss from "@astrojs/rss";
import { fetchFeed } from "../lib/api";

export async function get(context) {
  const posts = await fetchFeed();

  return rss({
    title: "My Online Store",
    description: "Online For Everyone",
    site: context.site,
    items: posts.map((post) => ({
      title: post.title,
      pubDate: Date.now(),
      description: post.description,
      // customData: post.data.customData,
      // Compute RSS link from post `slug`
      // This example assumes all posts are rendered as `/blog/[slug]` routes
      link: post.url,
    })),
  });
}

通常 fetchFeed 函数具有其

await
功能并且工作正常。然而在这种特殊情况下,我也必须将
map
方法设置为异步方法。对我来说,这似乎是我以前的网站(该网站有效)和当前网站(该网站无效)之间的唯一区别。

export const fetchFeed = async function () {
  const allPosts = await import.meta.glob("./../pages/**/*.md");
  // console.log("allPosts", allPosts);
  const posts = Object.values(allPosts).map(async (postData) => {
    const post = await postData();
    // console.log("inside", post.frontmatter);
    return { ...post.frontmatter, url: post.url };
  });

  return posts;
};

当我 console.log 帖子(在 rss.xml.js 中)时,我意识到

posts
不存在,因为 fetchFeed 函数调用尚未解析。它在调用 rss() 函数后解析。

我假设

await
关键字会延迟返回,直到它得到解决......但事实并非如此。

有人可以帮助我并指出我做错了什么吗?我不太擅长 Promise,希望得到一些帮助。

问候,

阿里姆

javascript node.js promise
2个回答
2
投票

你的

posts
是一系列 Promise。你需要等待。

  const posts = await Promise.all(Object.values(allPosts).map(async (postData) => {
    const post = await postData();
    // console.log("inside", post.frontmatter);
    return { ...post.frontmatter, url: post.url };
  }));

0
投票

使用

promise.all

代码将是这样的:

export async function get(context) {
  const postsPromises = await fetchFeed();

  const posts = await Promise.all(postsPromises);

  return rss({
    title: "My Online Store",
    description: "Online For Everyone",
    site: context.site,
    items: posts.map((post) => ({
      title: post.title,
      pubDate: Date.now(),
      description: post.description,
      link: post.url,
    })),
  });
}

© www.soinside.com 2019 - 2024. All rights reserved.