Возврат данных REST в другую функцию

Таким образом, я включаю AngularJS в страницу SharePoint, которую я создаю. У меня есть функция, которая собирает информацию из списка в SharePoint с помощью функции REST. То, что он должен сделать, это заполнить таблицу данными, которые он получает от вызова REST. Он делает это хорошо, однако, одно из полей является «лицо или группа» поле и вместо того, чтобы возвращать имя человека, он возвращает их ID, который является прекрасным, но он вызывает для меня, чтобы выполнить другой вызов REST в другом списке. Я успешно сделал это и отфильтровал результаты на основе идентификатора пользователя.Что я сделал, так это передал идентификатор пользователя функции, которая вызывает функцию REST в список, содержащий имя пользователя, а затем написал оператор if, в основном говорящий, что если переданный идентификатор равен заданному идентификатору элемента, отобразите имя пользователя. Проблема, с которой я сталкиваюсь, заключается в том, что, пока я получил правильные данные, я не могу вернуть данные, и я считаю, что причина заключается в том, что я пытаюсь вернуть данные из вложенных функций. У меня есть функция и внутри этой функции $http.функция успеха. Данные, которые я пытаюсь получить, находятся в $http.функция успеха.Извините, если этот вопрос трудно следовать, но, надеюсь, взглянув на ниже код поможет прояснить вещи.

P.S. Когда я оповещаю код из функции ‘displayProjDetails’, я получаю неопределенное сообщение, но когда я оповещаю его из функции ‘getUser’, он отображает данные правильно.

Заранее спасибо за любую помощь.

УГЛОВОЙ КОД:

// Function to display Project Details Data
        $scope.displayProjDetails = function() {

            $http({type: "GET", url:"http://mysiteurl/_api/web/lists/getbytitle('Project%20Details')/items?$top=5000", headers: { "ACCEPT": "application/json;odata=verbose"}})

            .success(function(data) {

                $scope.results = data.d.results;

                $scope.details = [];

                var full_funded;

                for(i=0; i < data.d.results.length; i++) {

                    if(data.d.results[i].gibi == $scope.selectedProject.id) {

                        alert($scope.getUser(data.d.results[i].Project_x0020_POCId)); // CALL TO FUNCTION I AM WORKING ON (LOCATED AT THE BOTTOM OF THE PAGE)

                        if(data.d.results[i].Fully_x0020_Funded == true) {
                            full_funded = "Yes";
                        } else {
                            full_funded = "No"
                        }

                        $scope.details.push({id: data.d.results[i].gibi, poc: data.d.results[i].Project_x0020_POCId, code_poc: data.d.results[i].Code_x0020_312_x0020_POCId, 
                                           perc_complete: data.d.results[i].OData__x0025__x0020_Complete, funded: full_funded, pop_from: data.d.results[i].PoP_x0020_From,
                                           pop_to: data.d.results[i].PoP_x0020_To});
                    }
                };

            }); 
        }

// Function to retrieve the name of the Point of Contact (Currently working on this...)
        $scope.getUser = function(value) {

            $http({type: "GET", url: "http://mysiteurl/_api/web/siteusers?$top=5000", headers: { "ACCEPT": "application/json;odata=verbose"}})

            .success(function(data) {

                $scope.results = data.d.results;

                $scope.user_attributes = [];

                for(i=0; i < data.d.results.length; i++) {  
                    if(data.d.results[i].Id == value) { 
                        return data.d.results[i].Title;
                    }
                };  
            });

        }

HTML-код

<div class="col-lg-9" id="project_details_table"> 
           <h3>Project Details</h3> 
           <table class="table table-striped"> 
              <thead> 
                 <tr> 
                    <th>Project ID</th> 
                    <th>PoC</th> 
                    <th>Code 2532 PoC</th> 
                    <th>% Complete</th> 
                    <th>Fully Funded</th> 
                    <th>PoP From</th> 
                    <th>PoP To</th> 
                 </tr> 
              </thead> 
              <tbody>
                 <tr data-ng-repeat="detail in details">
                    <td data-ng-bind="detail.id"></td>
                    <td data-ng-bind="detail.poc"></td> <!--TRYING TO REPLACE THIS WITH THE USER'S NAME INSTEAD OF THE USER'S ID-->
                    <td data-ng-bind="detail.code_poc"></td>
                    <td data-ng-bind="detail.perc_complete"></td>
                    <td data-ng-bind="detail.funded"></td>
                    <td data-ng-bind="detail.pop_from | date:'yyyy/MM/dd'"></td>
                    <td data-ng-bind="detail.pop_to | date:'yyyy/MM/dd'"></td>
                 </tr> 
              </tbody> 
           </table> 
        </div>

ОБНОВЛЕНИЕ:
После внесения рекомендуемых изменений в мой код, мои данные отображаются следующим образом.

Таблица

Как вы можете видеть, то, что я пытаюсь сделать, это заменить ‘[object Object]’ на собственное имя. Здесь это просто добавление новых строк в таблицу, а не размещение имени в правильном месте. Вот мой обновленный код.

$scope.getUser = function(value) {

            return $q(function(resolve, reject){

                $http({type: "GET", url: "http:mysiteurl/_api/web/siteusers?$top=5000", headers: { "ACCEPT": "application/json;odata=verbose"}})

                .success(function(data) {

                    $scope.results = data.d.results;

                        for(i=0; i < data.d.results.length; i++) {  
                            if(data.d.results[i].Id == value) { 
                                resolve(data.d.results[i].Title);
                            }
                        }; 

                });
            });
        }

// Function to display Project Details Data
        $scope.displayProjDetails = function() {

            $http({type: "GET", url:"http:mysiteurl/_api/web/lists/getbytitle('Project%20Details')/items?$top=5000", headers: { "ACCEPT": "application/json;odata=verbose"}})

            .success(function(data) {

                $scope.results = data.d.results;

                $scope.details = [];

                $scope.name = [];

                var full_funded;

                for(i=0; i < data.d.results.length; i++) {

                    if(data.d.results[i].gibi == $scope.selectedProject.id) {

                        $scope.name = $scope.getUser(data.d.results[i].Project_x0020_POCId).then(function(user){$scope.details.push({poc: user});});

                        if(data.d.results[i].Fully_x0020_Funded == true) {
                            full_funded = "Yes";
                        } else {
                            full_funded = "No"
                        }

                        $scope.details.push({id: data.d.results[i].gibi, poc: $scope.name, code_poc: data.d.results[i].Code_x0020_312_x0020_POCId, 
                                           perc_complete: data.d.results[i].OData__x0025__x0020_Complete, funded: full_funded, pop_from: data.d.results[i].PoP_x0020_From,
                                           pop_to: data.d.results[i].PoP_x0020_To});
                    }
                };

            }); 
        }

2 ответа

  1. Проблема в том, что вы работаете с асинхронными вызовами, поэтому вы не можете вернуть данные, потому что предупреждение не ждет ответа на обещание, поэтому один из способов решить проблему-вернуть обещание от getUser:

    return $http ...
    

    затем в оповещении :

    alert($scope.getUser(data.d.results[i].Project_x0020_POCId).then(function(name){return name;}));
    
  2. $scope.getUser = function(value) {
         return $q(function(resolve, reject){
                $http({type: "GET", url: "http://mysiteurl/_api/web/siteusers$top=5000",
                       headers: { "ACCEPT": "application/json;odata=verbose"}})
    
                .success(function(data) {
    
                    $scope.results = data.d.results;
    
                    $scope.user_attributes = [];
    
                    for(i=0; i < data.d.results.length; i++) {  
                        if(data.d.results[i].Id == value) { 
                            resolve(data.d.results[i].Title);
                        }
                    };  
                });
            }
    
    
    
    
    $scope.getUser(data.d.results[i].Project_x0020_POCId)
    .then(function(user){
       alert(user)
     });