Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 链接获取,获取,映射,筛选,获取,获取_Node.js_Promise_Return_Fetch_Chain - Fatal编程技术网

Node.js 链接获取,获取,映射,筛选,获取,获取

Node.js 链接获取,获取,映射,筛选,获取,获取,node.js,promise,return,fetch,chain,Node.js,Promise,Return,Fetch,Chain,我的问题有何不同: 成功链接承诺后,我将剩下单独的数组,列出文件和目录,需要再次获取这些目录中的文件,将其添加到第一个文件列表中,然后最终基于所有已完成的文件列表进行获取 每个函数本身,包括另一个未显示为进入目录并列出其中的文件的函数,都可以工作 在一天结束时,我只需要所有github repo中我拥有的任何package.json文件的内容,如果我走错了方向 我确实试着返回一个对象 { files: files, paths: paths } 但物体每次都是空的 listRepos=asyn

我的问题有何不同: 成功链接承诺后,我将剩下单独的数组,列出文件和目录,需要再次获取这些目录中的文件,将其添加到第一个文件列表中,然后最终基于所有已完成的文件列表进行获取

每个函数本身,包括另一个未显示为进入目录并列出其中的文件的函数,都可以工作

在一天结束时,我只需要所有github repo中我拥有的任何package.json文件的内容,如果我走错了方向

我确实试着返回一个对象

{
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
        }
    }))
}