Javascript 诺德
我试图通过遍历每个子项目从rally获取详细信息 但我没有得到任何打印,虽然我有一个控制台。日志(输出)在最后。当我在放入数组后立即打印输出时,我可以看到值。我做错了什么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'],
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