Recursion ES6中带有返回值的递归承诺

Recursion ES6中带有返回值的递归承诺,recursion,bluebird,es6-promise,ecmascript-6,Recursion,Bluebird,Es6 Promise,Ecmascript 6,我正在尝试(使用)递归地从GitHub获取内容。内容以递归方式获取,但输入承诺的最终结果是未定义: 获取内容的函数: _getRepoContent ( user, repo, ref, path ) { return new Promise( ( resolved, rejected ) => { this._client.repo( user + "/" + repo, ref ).contents( path, ( err, data ) => {

我正在尝试(使用)递归地从GitHub获取内容。内容以递归方式获取,但输入承诺的最终结果是
未定义

获取内容的函数:

_getRepoContent ( user, repo, ref, path ) {
    return new Promise( ( resolved, rejected ) => {
        this._client.repo( user + "/" + repo, ref ).contents( path, ( err, data ) => {
            if ( err ) {
                rejected( err );
            } else {
                resolved( data );
            }
        } );
    } );
}
主要递归函数:

getContentRec ( sourceDef, data ) {

    var results = data || [];
    return this._getRepoContent( sourceDef.user, sourceDef.repo, sourceDef.ref, sourceDef.path )
        .then( ( data ) => {

            let dirs = [];
            results = results.concat( data );

            data.forEach( ( file ) => {
                if ( file.type === "dir" ) {
                    dirs.push( file );
                }
            } );

            if ( dirs.length > 0 ) {
                let promises = [];
                dirs.forEach( ( dir ) => {
                    let def = {
                        user: sourceDef.user,
                        repo: sourceDef.repo,
                        ref: sourceDef.ref,
                        path: dir.path
                    };
                    promises.push( this.getContentRec( def, results ) );
                } );
                return Promise.all( promises );

            } else {
                return Promise.resolve( results );
            }
        } )
        .catch( ( err ) => {
            return Promise.reject( err );
        } );
}
称之为:

getContentRec( 
    { 
    user: "nodejs", 
    repo: "node"
    }
}).then( (data) => {
    // data is undefined
})

有什么想法吗?Thx提前了很多时间

解决了问题,下面是解决方案…:

getContentRec ( sourceDef ) {

    return this._getRepoContent( sourceDef.user, sourceDef.repo, sourceDef.ref, sourceDef.path )
        .map( ( content ) => {
            let def = {
                user: sourceDef.user,
                repo: sourceDef.repo,
                ref: sourceDef.ref,
                path: content.path
            };
            return content.type === "dir" ? this.getContentRec( def ) : content;
        } )
        .reduce( ( a, b ) => {
            return a.concat( b )
        }, [] );
}
注:
此解决方案使用的是bluebird,而不是纯ES6承诺。

Hm,有很多事情可以简化,但我看不出有什么真正的错误。
getContentRec
应该始终返回一个承诺,该承诺通过数组来实现。@Bergi,是的,您完全正确,代码可以简化为一个子集;-)这是蓝鸟,不是ES6承诺吗?是的,没有它就无法工作,编辑了答案以反映这一点。