Как объединить данные из двух сообщений http в один объект данных - PullRequest
0 голосов
/ 17 октября 2019

Я хочу объединить данные из двух разных сообщений http в одну переменную объекта. Я хочу запустить объединенные результаты через ng-repeat, чтобы отобразить объединенный список на экране. Есть ли способ сделать это в стандартном сценарии Java или я должен принести в библиотеку? Я пробовал object.assign, но получил нулевую или неопределенную ошибку объекта.

$http.post('Url1', {
  param: @scope.myParam
}).success(function (data) {
  $scope.myData1 = data;
});

$http.post('Url2', {
  param: @scope.myParam
}).success(function (data) {
  $scope.myData2 = data;
});

$scope.myData = Object.assign($scope.myData1, $scope.myData2);

Ответы [ 4 ]

2 голосов
/ 17 октября 2019

Используйте Promise.all для завершения обоих вызовов:

var promise1 = $http.post('Url1', {
      param: @scope.myParam
    }).success(function (data) {
      $scope.myData1 = data;
    });

     var promise2 = $http.post('Url2', {
      param: @scope.myParam
    }).success(function (data) {
      $scope.myData2 = data;
    });

    Promise.all([promise1, promise2]).then( (res) => {
        $scope.myData = Object.assign({}, $scope.myData1 , $scope.myData2 );
    });
2 голосов
/ 17 октября 2019

Я предполагаю, что ваши данные относятся к типу объектов, поэтому вы можете сделать это, используя синтаксис распространения как

var obj1={a:1};
var obj2={b:2};

var obj3={...obj1,...obj2}

console.log(obj3)

в вашем случае $scope.myData = {...$scope.myData1,... $scope.myData2};

, если ваши данные массив, чем использовать Array.concat

$scope.myData = $scope.myData1.concat($scope.myData2)

Также не забывайте ждать обещания, как указано в других ответах

Promise.all([promise1, promise2]).then( (res) => {//perform your merge here}
1 голос
/ 17 октября 2019

URL-вызовы являются асинхронными, то есть они будут выполняться отдельно от функции. Назначение объекта после обоих вызовов означает, что это произойдет после выполнения вызовов URLS, но НЕ ОБЯЗАТЕЛЬНО после завершения вызовов, поэтому оба значения данных будут неопределенными. Как и предполагалось, необходимо дождаться завершения обоих вызовов, прежде чем будут собраны данные для объединения и использования в других функциях

0 голосов
/ 17 октября 2019

Использование $q.all:

var promise1 = $http.post('Url1', {
  param: @scope.myParam
}).then(function(response) {
  return response.data;
});

var promise1 = $http.post('Url2', {
  param: @scope.myParam
}).then(function (response) {
  return response.data;
});

$q.all([promise1, promise2]).then([data1, data2] => {
  $scope.myData = {...data1, ...data2};  //combine object
  //OR
  $scope.myData = [...data1, ...data2];  //combine array
});

Помните, что обещания ES6, возвращаемые Promise.all, не интегрированы с платформой AngularJS. AngularJS изменяет обычный поток JavaScript, предоставляя собственный цикл обработки событий. Это разбивает JavaScript на классический и AngularJS контекст выполнения. Только операции, которые применяются в контексте выполнения AngularJS, выиграют от привязки данных AngularJS, обработки исключений, отслеживания свойств и т. Д.

Обещания, возвращаемые $q.all, интегрированы с инфраструктурой AngularJS.

Для получения дополнительной информации см.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...