2016-04-29 131 views
0

我有一个承诺问题的foreach,承诺与angularjs

$scope.refreshProject = function() { 
    project.getAll().then(function(results) { 
     angular.forEach(results, function(project) { 
      project_path = project.path; 
      project_file = project.file; 
      project_id = project.id; 

      console.log(project); 
      console.log('http://' + project_path + '/' + project_file); 

      $http.get('http://' + project_path + '/' + project_file) 
       .then(function(res){ 
        var project = new Project(); 
        project.update(project_id, { 'content': res.data }); 
       }); 

     }); 

     $scope.refresh(); 
    }); 
}; 

我的$ http.get不工作,

的console.log(的 'http://' + project_path +'/'+ project_file);

回报

'http:///'

我的变量是空瓶。

project.model.js

Project.prototype.getAll = function() { 
    return ProjectService.getAll(); 
}; 

project.service.js

this.getAll = function (params) { 
    var projects = []; 
    return db.selectAll('projects').then(function(results) { 
     for(var i=0; i < results.rows.length; i++){ 
      projects.push(results.rows.item(i)); 
     } 
     return projects; 
    }); 
}; 

我怎么能执行我的$ HTTP请求时,我从project.path的PARAMS和project.file可以吗?

解决

project.getAll().then(function(results) { 
     angular.forEach(results, function(project) { 
      (function(project) { 
       var project_id = project.id; 

       if (project.path) { 
        var promise = $http.get(project.path + '/' + project.file) 
         .then(function(res){ 
          var project = new Project(); 
          console.log(res.data); 
          project.update(project_id, { 'content': res.data }); 
         }); 
       } 

       promises.push(promise); 
      })(project); 
     }); 

     $q.all(promises).then(function() { 
      $scope.refresh(); 
      console.log('refresh() ok'); 
     }); 
    }); 
+2

使用'$ q.all'或'Promise.all' –

+1

你是否检查'的console.log(结果)'?这是对的吗? – dfsq

+0

在loop内部发送请求并不是个好主意。你的性能会很低,有时你的应用程序可能会崩溃,这就是为什么你需要在1个http请求中发送结果(作为数组) –

回答

0

大胆猜测:这取决于如何angular.forEach作品,包裹你的回调,像这样可以做到这一点。 (否则所有的回调可能与project的最后一个版本被称为,这里更详细JavaScript closure inside loops – simple practical example

$scope.refreshProject = function() { 
    project.getAll().then(function(results) { 
    angular.forEach(results, function(project) { 
     (function(project) { 
     project_path = project.path; 
     project_file = project.file; 
     project_id = project.id; 

     console.log(project); 
     console.log('http://' + project_path + '/' + project_file); 

     $http.get('http://' + project_path + '/' + project_file) 
      .then(function(res){ 
      var project = new Project(); 
      project.update(project_id, { 'content': res.data }); 
      }); 
     })(project); 
    }); 

    $scope.refresh(); 
    }); 
}; 
1

首先,检查results包含正确的数据 - 那些console.logs是空表明,它不是,那projectService.getAll()没有回报你所期望的。

假设按预期工作,你有三个独立的变量都命名为“项目”:

project.getAll().then(function(results) { 
// ^^^^^^^ 1 
     angular.forEach(results, function(project) { 
//          ^^^^^^^ 2 
      project_path = project.path; 
//       ^^^^^^^ 2 
//   ... 
      $http.get('http://' + project_path + '/' + project_file).then(function(res){ 
       var project = new Project(); 
//     ^^^^^^^ 3 

关闭我的头顶,我真的不知道其中哪些是覆盖其别人,特别是因为涉及到异步代码 - 但我敢打赌至少有一个镍是必须的。

如果不出意外改变这些不同的名称将使维护和调试更简单...