2016-04-29 200 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 

關閉我的頭頂,我真的不知道其中哪些是覆蓋其別人,特別是因爲涉及到異步代碼 - 但我敢打賭至少有一個鎳是必須的。

如果不出意外改變這些不同的名稱將使維護和調試更簡單...