Node.js 链接获取,获取,映射,筛选,获取,获取
我的问题有何不同: 成功链接承诺后,我将剩下单独的数组,列出文件和目录,需要再次获取这些目录中的文件,将其添加到第一个文件列表中,然后最终基于所有已完成的文件列表进行获取 每个函数本身,包括另一个未显示为进入目录并列出其中的文件的函数,都可以工作 在一天结束时,我只需要所有github repo中我拥有的任何package.json文件的内容,如果我走错了方向 我确实试着返回一个对象Node.js 链接获取,获取,映射,筛选,获取,获取,node.js,promise,return,fetch,chain,Node.js,Promise,Return,Fetch,Chain,我的问题有何不同: 成功链接承诺后,我将剩下单独的数组,列出文件和目录,需要再次获取这些目录中的文件,将其添加到第一个文件列表中,然后最终基于所有已完成的文件列表进行获取 每个函数本身,包括另一个未显示为进入目录并列出其中的文件的函数,都可以工作 在一天结束时,我只需要所有github repo中我拥有的任何package.json文件的内容,如果我走错了方向 我确实试着返回一个对象 { files: files, paths: paths } 但物体每次都是空的 listRepos=asyn
{
files: files,
paths: paths
}
但物体每次都是空的
listRepos=async()=>{
常量路径='/user/repos'
返回获取(api+路径、选项)
.then(res=>res.json())
.then(json=>json.filter(repo=>{
return repo.owner.login==用户
}))
}
listContents=async(repo)=>{
const path=`/repos/${repo.owner.login}/${repo.name}/contents`
返回获取(api+路径、选项)
.then(res=>res.json())
}
getNext=async()=>{
让内容=[]
let repoList=wait listRepos()
返回repoList.map(异步(repo)=>{
等待listContents(repo)。然后(async(contents)=>{//对于每个repo都会发生这种情况
let pathList=wait contents.filter(条目=>{
return entry.type=='dir'&&entry.name!='node\u modules'
})
pathList.forEach(path=>path.push(path))
let fileList=wait contents.data.filter(条目=>{
return entry.name==“package.json”
})
})
返回{
文件:文件列表,
路径:路径列表
}
})
}
我在两人之间来回穿梭
Promise { <pending> }
Promise{}
或“未经处理的拒绝承诺”
我确实意识到我需要捕获所有错误,为了节省空间和可读性,我在这里从代码中删除了这些错误。您得到了大量的
Promise{}
,因为您正在将您的报告列表映射到promises:
return repoList.map(async (repo) => {
异步函数总是返回一个承诺。你想要那些承诺所要体现的价值观。您可以使用Promise.all获取承诺数组的值:
Promise.all([promise, promise]).then(values => console.log(values)
// ['foo', 'bar']
因此,您有一个回购协议列表,然后将此列表映射到承诺,然后将其映射回已解析的值:
const values = await Promise.all(['foo', 'bar'].map(val => fetchSomething(val)))
就你而言:
return Promise.all(repoList.map(async (repo) => {
...
}));
Promise.all
返回一个承诺,因此请记住使用wait getNext()
在repoList映射函数中,您正在listContents映射函数范围内声明
let pathList
和let fileList
,然后尝试从repoList映射函数范围访问它们。您可能希望直接返回它们,如下所示:
getNext = async () => {
let contents = []
let repoList = await listRepos()
return repoList.map((repo) => {
return listContents(repo).then(async (contents) => { // This happens for each repo
let pathList = await contents.filter(entry => {
return entry.type === 'dir' && entry.name != 'node_modules'
})
pathList.forEach(path => paths.push(path))
let fileList = await contents.data.filter(entry => {
return entry.name === 'package.json'
})
return {
files: fileList,
paths: pathList
}
})
})
}
正如@ezakto已经指出的,您的函数返回一个承诺数组。添加一个
Promise.all
调用以获得对结果数组的承诺。还可以通过不使用then
来简化async
函数,您可以在其中使用await
(并将await
s放在过滤器
ed数组中-其中没有异步项):
我可以成功地获得repoList的输出,在它后面链接listContents会给我挂起。你能扩展你的答案让我处理listContents的输出吗?我确信一旦我有了文件和目录的列表,我就可以从那里开始了。好的,对不起。我开发了我看到的第一个问题,没有太注意repoList.map函数的内部部分。我在更新我的答案,变量声明有问题什么是
路径
?文件路径,方向否,我的意思是:它是在哪里定义的?路径
变量未在任何位置声明。
async function getNext() {
let repoList = await listRepos()
return Promise.all(repoList.map(async repo => {
const contents = await listContents(repo);
const pathList = contents.filter(entry => {
return entry.type === 'dir' && entry.name != 'node_modules'
})
// paths.push(...pathList)
const fileList = contents.data.filter(entry => {
return entry.name === 'package.json'
})
return {
files: fileList,
paths: pathList
}
}))
}