Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.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
Javascript 诺德_Javascript_Node.js_Asynchronous_Recursion_Promise - Fatal编程技术网

Javascript 诺德

Javascript 诺德,javascript,node.js,asynchronous,recursion,promise,Javascript,Node.js,Asynchronous,Recursion,Promise,我试图通过遍历每个子项目从rally获取详细信息 但我没有得到任何打印,虽然我有一个控制台。日志(输出)在最后。当我在放入数组后立即打印输出时,我可以看到值。我做错了什么 function getProjects(projectRef, output) { var deferred = Promise.defer(); callAc(projectRef, ['FormattedID', 'Name', 'Children', 'Parent', 'TeamMembers'],

我试图通过遍历每个子项目从rally获取详细信息

但我没有得到任何打印,虽然我有一个控制台。日志(输出)在最后。当我在放入数组后立即打印输出时,我可以看到值。我做错了什么

function getProjects(projectRef, output) { 
    var deferred = Promise.defer();
    callAc(projectRef, ['FormattedID', 'Name', 'Children', 'Parent', 'TeamMembers'], function(result) {
        result.Object.Results.forEach(function(item) {
            output.push(item.Name);
            getProjects(item.Children._ref.split('webservice/v2.0')[1], output)
                .then(function() {
                    deferred.resolve();
                });
        });
    });
    return deferred.promise;
}

function callAc(ref, parameters, callback) {
    restApi.get({
        ref: ref,
        fetch: parameters,
        scope: {
            workspace: '/workspace/XXXX'
        },
        requestOptions: {}
    }).then(function(result) {
        callback(result);
    }).fail(function(errors) {
        console.log(errors);
    });
}

var output = [];
var projectRef = '/Project/<some_project_id>/Children';
getProjects(projectRef, output)
    .then(function() {
        console.log('fetched all projects');
        console.log(output);
    });
函数getProjects(projectRef,output){
var deferred=Promise.deferred();
callAc(projectRef,['FormattedID','Name','Children','Parent','TeamMembers',函数(结果){
result.Object.Results.forEach(函数(项){
输出.推送(项.名称);
getProjects(item.Children.\u ref.split('webservice/v2.0')[1],输出)
.然后(函数(){
延迟。解决();
});
});
});
回报。承诺;
}
函数callAc(ref,参数,回调){
重新开始({
参考:参考,
获取:参数,
范围:{
工作区:'/workspace/XXXX'
},
请求选项:{}
}).然后(函数(结果){
回调(结果);
}).失败(功能错误){
console.log(错误);
});
}
var输出=[];
var projectRef='/Project//Children';
getProjects(projectRef,输出)
.然后(函数(){
log('fetched all projects');
控制台日志(输出);
});

来源:

首先,你看错了教程。从2015年开始。今天,标准没有fail()或defer()。失败处理程序位于then()的第二个参数中

另一个问题是回调。承诺的目的之一是减少回收。我将回调重新定位到then()

最后,在原始代码中有一个无限循环,我在其中添加了递归终止1==0

在本例中,“项目”结构是

       root 
      /    \
     1      2
    / \    / \
   4   5  6   7
  / \    
 8   9 

如果我正确读取了您的代码,
回调
在您的
restApi
调用失败时不会被调用。如果是这样的话,在最后一次调用
getProjects
时创建的承诺将永远无法解决,因此在第一次调用
getProjects
时创建的总体承诺将永远无法解决,因此您的
then
回调将永远不会被调用。我的代码中有forEach,你建议怎么做?这不是无限循环,因为在每次迭代中我都会传递孩子们的引用。。所以在某一点上不会有任何孩子对不起,我第一次没有抓住forEach循环,还以为它是无限循环。我更新了答案。我使用一个
Promise.all
来处理
forEach
。但是,缺点是,它会弄乱
res
。如果您可以接受使用
output
捕获结果,那么应该可以。感谢更新,我不应该将项目结构保留在代码中,因为我有大约1000个项目。。。
       root 
      /    \
     1      2
    / \    / \
   4   5  6   7
  / \    
 8   9