使用angularjs

时间:2016-04-29 12:28:33

标签: javascript angularjs angular-promise

我有一个承诺的问题,

$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;
    });
};

当我从project.path和project.file获取params时,如何执行我的$ http请求?

  

解决

    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 个答案:

答案 0 :(得分:1)

首先,检查results是否包含正确的数据 - 那些console.logs为空的表明它不是,并且projectService.getAll()没有返回您的预期。

假设它按预期工作,您有三个单独的变量,全部命名为“project”:

    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

我真的不知道其中哪一个覆盖了其他哪一个,特别是因为涉及异步代码 - 但我敢打赌至少其中一个必须是镍。

如果没有其他任何改变不同名称的东西将使维护和调试更容易......

答案 1 :(得分: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();
  });
};