Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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 回调在Node Express JS中不起作用_Javascript_Node.js_Express_Callback_Request - Fatal编程技术网

Javascript 回调在Node Express JS中不起作用

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

我很努力想让这一切顺利,但我做不到

此函数位于路由器内部。获取函数。我的前端应用程序给我打电话,我请求其他服务。 在这项服务中,我获得有关父文件夹的信息。在此之后,我制作了一个foreach(localProjects.foreach)来获取信息文件夹,这个回调运行得很好,但是当我发送projects:localProjects时,小时数仍然为0。我打印小时数,但由于某种原因,小时数仍然为零

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设计模式第二版,并通过示例进行操作。