2016-04-29 5 views
0

У меня есть проблема с обещанием,Promise в Еогеасп с 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 и 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

Непростая идея отправить запрос внутри цикла. Ваша производительность будет очень низкой, иногда ваше приложение может сбой, поэтому вам нужно отправить результат (как массив) в 1 HTTP-запрос –

ответ

0

Wild догадка: в зависимости от того, как 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 

Off верхней части моей головы, я честно понятия не имею, какой из них является перезаписана, какая из других, тем более, что есть асинхронный код, но я поставил бы никель, по крайней мере, один из них.

Если ничего не меняя те различные имена сделает обслуживание и отладку проще ...

Смежные вопросы