2014-09-06 3 views
1

Я написал эту услугуИспользование Promise возвращает неопределенное

var app = angular.module('Todo', []); 

app.service('$SharePointJSOMService', function ($q, $http) { 
    this.getListItems = function ($scope, listTitle) { 
     var deferred = $q.defer(); 
     //First we must call the EnsureSetup method 
     JSRequest.EnsureSetup(); 
     hostweburl = decodeURIComponent(JSRequest.QueryString["SPHostUrl"]); 
     appweburl = decodeURIComponent(JSRequest.QueryString["SPAppWebUrl"]); 
     var restQueryUrl = appweburl + "/_api/SP.AppContextSite(@target)/web/lists/getByTitle('" + listTitle + "')/items?$select=Title&@target='" + hostweburl + "'"; 
     var executor = new SP.RequestExecutor(appweburl); 
     executor.executeAsync({ 
      url: restQueryUrl, 
      method: "GET", 
      headers: { "Accept": "application/json; odata=verbose" }, 
      success: function (data, textStatus, xhr) { 
       console.log('call was a success'); 
       console.log(JSON.parse(data.body)); 
       deferred.resolve(JSON.parse(data.body)); 
      }, 
      error: function (xhr, textStatus, errorThrown) { 
       alert('call failed'); 
       alert(textStatus); 
       alert(JSON.stringify(xhr)); 
       deferred.reject(JSON.stringify(xhr)); 
      } 
     }); 
     return deferred; 
    }; 
}); 

Я называю эту услугу в мой контроллер

app.controller('TodoController', function ($scope, $SharePointJSOMService) { 
    $scope.todos = []; 
    var promise = $SharePointJSOMService.getListItems($scope, 'TodoList'); 
    promise.then(function (data) { 
     console.log("came inside the promise success method"); 
     $scope.todos = [];   
     angular.forEach(data.data.d.results, function (todo) { 
      console.log(todo); 
      $scope.todo.push({ 
       text: todo.Title 
      }); 
     }); 
    }, function (data) { 
     console.log("Error " + data); 
    }); 
}); // controller 

В журнале можно увидеть

call was a success App.js:17 
Object {d: Object} App.js:18 
TypeError: undefined is not a function 
    at new <anonymous> (http://app-6c6f508a56f90c.abhiapps.com/HelloWorld/Scripts/App.js:83:13) 
    at invoke (http://app-6c6f508a56f90c.abhiapps.com/HelloWorld/Scripts/angular.js:3966:17) 

Таким образом, в метод обслуживания, успешный вызов, и я вижу, что он печатает правильные результаты. Но когда я называю метод «prom.then» в контроллере, я получаю неопределенное для обещания.

ответ

2

Я думаю, что вы должны вернуть обещание, а не только «отложенное».

return deferred.promise;