2016-11-23 2 views
0

Мы пытаемся обновить завод, который возвращает обещание. Оригинальная фабрика использует $ http-> success-> error, а контроллер имеет .then (...).Угловое обещание разрешено до заводского исполнения

Мы хотим «перенести» с успеваемости/ошибки, чтобы затем/уловить, но мы получаем следующее сообщение об ошибке в контроллере: TypeError: Cannot read property 'then' of undefined.

Методы Factory являются следующие():

'use strict'; 
xmsbsExtranet.factory('projectsTimeTrackingServices', ['$resource', '$http', '$log', '$q', 'membershipServices', 
    function ($resource, $http, $log, $q, membershipServices) { 
     var serviceBase = 'http://localhost:51617/api/'; 
     var _model = {}; 

     var service = { 
      model: _model, 
      getByProjectId: _getByProjectId_new, 
      upsert: _upsert, 
     }; 
     return service; 

     function _getByProjectId_old(projectId) { 
      var deferred = $q.defer(); 
      $http({ 
       method: "Get", 
       url: "../api/projectsTimeTracking/project/" + projectId 
      }).success(function (response) { 
       deferred.resolve(response); 
      }).error(function (err, status) { 
       //membershipServices.logOut(); 
       deferred.reject(err); 
      }); 

      return deferred.promise; 
     }; 

     function _getByProjectId_new(projectId) { 
      $http.get("../api/projectsTimeTracking/project/" + projectId) 
      .then(function (response) { 
       return response.data; 
      }).catch(function (err, status) { 
       //membershipServices.logOut(); 
       return err; 
      }); 
     }; 

    }]); 

"короткий" вариант контроллера следующим образом:

projectsTimeTrackingServices 
    .getByProjectId(vm.project.xrmId) 
    .then(function (data) { 
     //do something with the data 
    }); 

Когда служба выполняет метод "_getByProjectId_old", все Работает так, как ожидалось. Но если я изменю его на «_getByProjectId_new», я получаю афферентную ошибку.

Любая помощь будет принята с благодарностью. С уважением

ответ

3

Исправьте меня, если я ошибаюсь, но вы ничего не возвращаете из «новой» версии этой функции.

function _getByProjectId_new(projectId) { 

     //note that nothing is returned in THIS scope. 

     $http.get("../api/projectsTimeTracking/project/" + projectId) 
     .then(function (response) { 
      return response.data; 
     }).catch(function (err, status) { 
      //membershipServices.logOut(); 
      return err; 
     }); 
    }; 

Вы можете исправить это с помощью этого кода:

function _getByProjectId_new(projectId) { 

     //note the new return statement 
     return $http.get("../api/projectsTimeTracking/project/" + projectId) 
    }; 

или этот код (в зависимости от того, хотите ли вы вернуть 'ответ' или 'response.data'):

function _getByProjectId_new(projectId) { 

     //note the new return statement 
     return $http.get("../api/projectsTimeTracking/project/" + projectId) 
      .then(function (response) { 
       return response.data; 
      }); 
    }; 

Я бы воздержался от обнаружения ошибки внутри этой функции, так как если вы поймаете ошибку, ваш код контроллера не сможет ее поймать.

Возможно, вам стоит прочитать некоторую документацию по обещаниям, а затем/уловить цепочку, это немного сложно.

+0

Разница заключается в операторе return * before * '$ http.get'. Для того, чтобы контроллер мог называть «. Then» на что-то, это «что-то» должно быть возвращено. – user1935361

+0

Вы ПОЛНОСТЬЮ правы !!!! Большое вам спасибо за вашу помощь!!! – aplon