2017-06-15 140 views
-1

工作我如此努力,使这项工作,但我不能。回调不节点快速JS

这个函数是一个router.get功能内。我的前端应用程序让我打电话,并请求其他服务。 在该服务中我得到了父文件夹的信息。在此之后我做一个foreach (localProjects.forEach)来获取信息的文件夹,这个回调是相当不错的,但是当我送项目: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) 
     } 
    }); 
} 

回答

1

,因为你正在发送的请求getFolderHours执行完毕之前,您的代码不起作用。这是因为getFolderHours是异步,所以你必须使其业务在localProjects for循环完成执行。

我会做的是将getFolderHours换成promise对象,并在localProjects完成循环后解决它们。如果你不熟悉的承诺呢,我建议你阅读了关于承诺我所提供的链接。所以,你的代码看起来像下面这样:

request.get('/folders/'+parentFolder+'/folders?descendants=false&project=false', { 
 
    'auth': { 
 
     'bearer': Token 
 
    } 
 
}, function(err, response, body) { 
 
    var folders = JSON.parse(body); 
 
    var localProjectsResolved = []; 
 
    //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){ 
 
     var currentFolderHours = getFolderHours(folder,{start:start, end:end}, function (hours) { 
 
      console.log('Total hrs:'+ hours) 
 
      localProjects[index].hours = hours; 
 
     }); 
 
     localProjectsResolved.push(currentFolderHours); 
 
    }); //end localprojects 
 
    console.log('responding'); 
 
    // resolve all localprojects 
 
    Promise.all(localProjectsResolved).then(function(localProjectResults) { 
 
     // got the results, send the request 
 
     res.send({totalHours: totalHours, projects:localProjectResults}); 
 
    }); 
 
}); // end request timelog 
 

 
// wrap getFolderHours in promise 
 
function getFolderHours(folder,period) { 
 
    return new Promise(function(resolve, reject) { 
 
    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 
 
       }); 
 
       // resolve the number of hours 
 
       resolve(hours); 
 
      } else { 
 
      reject(err); 
 
      } 
 
     }); 
 
    }); 
 
}

+0

这是真棒!老兄。我一直在阅读有关承诺的内容,我认为我可以仅通过回调就可以做到这一点。我从节点j开始,我想遵循最佳实践,但我想我需要更多经验并阅读更多内容。谢谢,老兄任何提示是值得欢迎的。我真的很感谢你的帮助 –

+1

我真的建议设计的NodeJS模式第2版,并通过实例工作。 –