Javascript 回调在Node Express JS中不起作用
我很努力想让这一切顺利,但我做不到 此函数位于路由器内部。获取函数。我的前端应用程序给我打电话,我请求其他服务。 在这项服务中,我获得有关父文件夹的信息。在此之后,我制作了一个foreach(localProjects.foreach)来获取信息文件夹,这个回调运行得很好,但是当我发送projects:localProjects时,小时数仍然为0。我打印小时数,但由于某种原因,小时数仍然为零Javascript 回调在Node Express JS中不起作用,javascript,node.js,express,callback,request,Javascript,Node.js,Express,Callback,Request,我很努力想让这一切顺利,但我做不到 此函数位于路由器内部。获取函数。我的前端应用程序给我打电话,我请求其他服务。 在这项服务中,我获得有关父文件夹的信息。在此之后,我制作了一个foreach(localProjects.foreach)来获取信息文件夹,这个回调运行得很好,但是当我发送projects:localProjects时,小时数仍然为0。我打印小时数,但由于某种原因,小时数仍然为零 request.get('/folders/'+parentFolder+'/folders?desce
request.get('/folders/'+parentFolder+'/folders?descendants=false&project=false', {
'auth': {
'bearer': Token
}
}, function(err, response, body) {
var folders = JSON.parse(body);
//console.log(folders);
folders.data.forEach(function (folder) {
localProjects.push({id: folder.id, name: folder.title, hours: 0})
});
// console.log(localProjects)
localProjects.forEach(function(folder, index){
getFolderHours(folder,{start:start, end:end}, function (hours) {
console.log('Total hrs:'+ hours)
localProjects[index].hours = hours;
})
}); //end localprojects
console.log('responding')
res.send({totalHours: totalHours, projects:localProjects});
}); // end request timelog
我的回调函数如下
var getFolderHours = function (folder,period, callback) {
request.get('folders/'+folder.id+'/timelogs?trackedDate={"start":"'+period.start+'T00:00:00","end":"'+period.end+'T23:59:59"}',{
'auth': {
'bearer':Token
}
}, function (err, response, body){
var timelog = JSON.parse(body);
var hours = 0 ;
if (! err){
console.log('Name:'+ folder.name);
console.log('Hrs:'+ folder.hours);
// console.log('Id:'+ folder.id);
timelog.data.forEach(function (task) {
console.log('Adding:'+ task.hours);
hours += task.hours
});
callback(hours)
}
});
}
您的代码无法工作,因为您正在getFolderHours完成执行之前发送请求。这是因为
getFolderHours
是异步的,因此必须在localProjects
中对其操作进行处理,才能完成循环执行
我要做的是在对象中包装getFolderHours
,并在localProjects
完成循环后解析它们。如果你还不熟悉承诺,我建议你阅读我提供的承诺链接。因此,您的代码如下所示:
request.get('/folders/'+parentFolder+'/folders?后代=false&project=false'{
“auth”:{
“持票人”:代币
}
},功能(错误、响应、正文){
var folders=JSON.parse(body);
var localProjectsResolved=[];
//控制台日志(文件夹);
folders.data.forEach(函数(文件夹){
localProjects.push({id:folder.id,name:folder.title,小时数:0})
});
//console.log(本地项目)
forEach(函数(文件夹、索引){
var currentFolderHours=getFolderHours(文件夹,{start:start,end:end},函数(小时){
console.log('总小时数:'+小时数)
本地项目[索引]。小时数=小时数;
});
localProjectsResolved.push(currentFolderHours);
});//结束本地项目
console.log('responding');
//解决所有本地项目
Promise.all(localProjectsResolved)。然后(function(localProjectResults){
//得到结果后,发送请求
res.send({totalHours:totalHours,projects:localProjectResults});
});
}); // 结束请求时间日志
//用承诺包装getFolderHours
函数getFolderHours(文件夹,期间){
返回新承诺(功能(解决、拒绝){
request.get('folders/'+folder.id+'/timelogs?trackedDate={“开始”:“+period.start+'T00:00:00”,“结束”:“+period.end+'T23:59:59”}”{
“auth”:{
“持票人”:代币
}
},功能(错误、响应、正文){
var timelog=JSON.parse(body);
var小时=0;
如果(!err){
console.log('Name:'+folder.Name);
console.log('Hrs:'+folder.hours);
//console.log('Id:'+folder.Id);
timelog.data.forEach(函数(任务){
console.log('Adding:'+task.hours);
小时数+=任务时间
});
//解析小时数
解决(小时);
}否则{
拒绝(错误);
}
});
});
}
真是太棒了,伙计!!。我一直在读关于承诺的书,我想我可以通过回调来做到这一点。我从NodeJS开始,我想遵循最佳实践,但我想我需要更多的经验和阅读。谢谢,伙计,欢迎给小费。我真的很感谢你的帮助,我真的推荐nodejs设计模式第二版,并通过示例进行操作。