Javascript在地图中获取

Javascript在地图中获取,javascript,arrays,fetch,github-api,fetch-api,Javascript,Arrays,Fetch,Github Api,Fetch Api,我有一个网站/公文包,在那里我使用Github API显示我的所有项目。我的目标是为这些项目创建一个过滤器,因此我在一些存储库的根目录中创建了一个名为“build with.json”的文件,该文件只存在于两个存储库中,仅用于测试目的,这是我在项目中使用的一系列技术(例如:[“React”、“Javascript”、…])。因此,我需要获取Github APi(该部分工作正常),然后获取该文件,并返回一个新的项目数组,但带有一个“filters”键,其中值是“build with.json”中的

我有一个网站/公文包,在那里我使用Github API显示我的所有项目。我的目标是为这些项目创建一个过滤器,因此我在一些存储库的根目录中创建了一个名为“build with.json”的文件,该文件只存在于两个存储库中,仅用于测试目的,这是我在项目中使用的一系列技术(例如:[“React”、“Javascript”、…])。因此,我需要获取Github APi(该部分工作正常),然后获取该文件,并返回一个新的项目数组,但带有一个“filters”键,其中值是“build with.json”中的数组。例如:

Github API返回(仅返回一个项目的示例):

我需要的新对象数组:

[{
"id": 307774617,
"node_id": "MDEwOlJlcG9zaXRvcnkzMDc3NzQ2MTc=",
"name": "vanilla-javascript-utility-functions",
"full_name": "RodrigoWebDev/vanilla-javascript-utility-functions",
"private": false,
"filters": ["HTML5", "CSS3", "JS", "React"]
}]
这就是我所做的:

const url = "https://api.github.com/users/RodrigoWebDev/repos?per_page=100&sort=created";
fetch(url)
  .then((response) => response.json())
  .then((data) => {
      return data.map(item => {
        //item.full_name returns the repositorie name
        fetch(`https://raw.githubusercontent.com/${item.full_name}/master/built-with.json`)
          .then(data => {
            item["filters"] = data
            return item
          })
      })
    })
  .then(data => console.log(data))
但它不起作用!我在控制台中看到:

有人能帮我吗?提前谢谢


注意:如果您发现一些语法错误,我的英语很抱歉,这是一个正在进行的工作。您不需要将.then()链接到fetch()。fetch()返回一个承诺。Array.prototype.map()返回一个数组。总而言之,你最终会得到一系列的承诺。您可以使用Promise.all(arrayOfPs)解析承诺数组

编辑:在你的评论和回顾你的问题之后,我重写了这个,这样它就可以从过滤的存储库列表中检索技能

const url=`https://api.github.com/users/RodrigoWebDev/repos?per_page=100&sort=created`;
(异步()=>{
//最终结果
让结果;
试一试{
//获取所有存储库
const repos=wait fetch(url).then((res)=>res.json());
const responses=等待承诺(
//从每个存储库请求名为“build with.json”的文件
回购地图((项目)=>{
回传(
`https://raw.githubusercontent.com/${item.full_name}/master/build-with.json`
);
})
);
//过滤掉所有非200 http响应代码(基本上是404错误)
const filteredResponses=responses.filter((res)=>res.status==200);
结果=承诺(
//从URL中获取项目名称,并从文件中获取技能
filteredResponses.map(异步(fr)=>{
const project=fr.url.match(/(RodrigoWebDev)\/(\S+)(=\/master)/)[2];
const skills=wait fr.json();
返回{
项目:项目,,
技能:技能
};
})
);
}捕捉(错误){
log(“错误:”,err);
}
然后((s)=>console.log);

})();您有多个问题:

  • 在map函数内部,您不会返回任何结果
  • map函数的结果实际上是另一个承诺(因为内部的fetch)
  • 因此,您需要做的是:

  • 从地图返回承诺-因此,您将拥有一系列承诺
  • 使用Promise.all等待第1点的所有承诺
  • 大概是这样的:

    
    
        var url1 = "https://api.github.com/users/RodrigoWebDev/repos?per_page=100&sort=created";
        var datum = fetch(url1)
          .then((response) => response.json())
          .then((data) => {
              return Promise.all(data.map(item => {
                //item.full_name returns the repositorie name
                return fetch(`https://raw.githubusercontent.com/${item.full_name}/master/built-with.json`)
                  .then(data => {
                    item["filters"] = data
                    return item
                  })
              }));
            }).then(data => console.log(data))
    
    

    问题是没有返回提取,因此.map()返回未定义。我可以建议使用async Wait的解决方案吗

    consturl=”https://api.github.com/users/RodrigoWebDev/repos?per_page=100&sort=created";
    然后(data=>console.log(data));
    异步函数getData(url){
    const response=等待获取(url);
    const data=wait response.json();
    常量arrOfPromises=data.map(项=>fetch(`https://raw.githubusercontent.com/${item.full_name}/master/build with.json`)
    );
    返还承诺。全部(全部承诺);
    
    }
    这里有几件事。您不需要将
    .then()
    链接到
    fetch()
    fetch()
    返回承诺
    Array.prototype.map()
    返回一个数组。总而言之,你最终会得到一系列的承诺。您可以使用
    Promise.all(arrayOfPs)
    解析承诺数组。您需要链接
    Promise.all
    。请看。您在内部
    获取之前错过了
    返回
    https://raw.githubusercontent…
    您甚至没有更改我的变量名:-)对不起,我使用了您的示例作为参考。我还对你的答案投了赞成票,因为它是正确的。如果你有问题,我会删除这个答案@RandyCasburnNO-不要删除你的答案!它和我的一样有效。我只是在戏弄你。你的例子是返回一个新的承诺数组,我需要一个带有关键“过滤器”的github项目数组,我是如何达到这个结果的?嘿,Nikitia。它起作用了,但返回的新对象数组不是过滤器数组,而是fetch的返回,请参见。我试图像这样将repsonse传递给json,但它不起作用。要了解那里发生了什么,我需要查看您收到了什么,您可以尝试.text()而不是.json()-也许它会给您一个cluewith.text()它工作了,但返回了一个字符串(检查返回数组中的“my website”repositorie),我可以将该字符串更改为数组,但是否有方法将其作为数组?为了让您更好地理解,我想获取两个存储库的文件“build with.json”,repostories是我的网站和border radius previewer,如果a可以为这两个文件工作,我将在每个项目中创建该文件以构建我的过滤器。我需要确切地看到您从网络收到的内容,可能是json在那里被字符串化了,或者类似的东西,你可以尝试json.parse on text()并查看它是否有效。请检查这个url:jsfiddle.net/gtqjna1y,在开发工具控制台中检查返回数组中的“我的网站”repositorie,这就是我正在接收的内容,或者你可以看到这个屏幕截图。JSON.parse不起作用,因为响应不是JSON字符串化的,而是promise对象。您的示例正在返回一个新的承诺数组,我需要一个带有键“filters”的github项目的新数组,如何获得此结果?示例正在返回一个HTTP响应数组。它们都是404个错误。我想我不明白你的意思,也不明白你在结果中看到了什么
    
    
        var url1 = "https://api.github.com/users/RodrigoWebDev/repos?per_page=100&sort=created";
        var datum = fetch(url1)
          .then((response) => response.json())
          .then((data) => {
              return Promise.all(data.map(item => {
                //item.full_name returns the repositorie name
                return fetch(`https://raw.githubusercontent.com/${item.full_name}/master/built-with.json`)
                  .then(data => {
                    item["filters"] = data
                    return item
                  })
              }));
            }).then(data => console.log(data))