0
votes

Comment combine-tu des données de deux messages http dans un objet de données

Je souhaite combiner des données de deux postes http différents dans une variable d'objet. Je souhaite exécuter les résultats combinés via NG-REPEAT pour afficher une liste combinée à l'écran. Existe-t-il un moyen de le faire dans le script Java standard ou dois-je apporter une bibliothèque? J'ai essayé Object.Assign mais j'ai reçu une erreur d'objet nulle ou non définie.

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


3 commentaires

Encore une fois, utilisez la promesse.Tous attendre les deux appel à terminer, puis fusionner les données


Dupliqué possible de fusionner deux JSON ensemble dans un JSON à Ngoninit fonction


La méthode . / Code> a été Supprimé du cadre angularjs .


4 Réponses :


2
votes

Je suppose que vos données sont de type d'objet afin que vous puissiez le faire en utilisant SECTIONN SYNTAX comme

P>

Promise.all([promise1, promise2]).then( (res) => {//perform your merge here}


2 commentaires

La promesse.All avec la propagation de l'opérateur fonctionne définitivement où je ne pouvais pas obtenir objet .Assigner pour me donner des résultats combinés. Cependant, il y a une autre complication avec la promesse. Tout ce que je n'avais pas pensé. Je n'appellerai pas toujours les deux messages http. Basé sur des conditions, parfois, j'appellerai l'un ou l'autre ou les deux. Puis-je simplement configurer Mutiple Promis.All's? Par exemple: promesse.Tous ([promess1, promesse2]) ...., promesse.Tous ([promess1]) ...., promesse.Tous ([promess2]) .....


@Bill oui vous pouvez



2
votes

Utilisez la promesse.Tous pour les deux appel à terminer:

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 commentaires

Aucune autre erreur cette fois mais je ne suis pas capable de faire fonctionner cela. $ SPAND.MYDATA1 a des données. $ Porce.MyData2 a des données. $ portée.mydata n'a rien. Typescript est également impliqué. Je suppose que je dois déclarer Promess1 & Promis2 dans Typescript. Si tel est le cas, quel type de jjbectes serait-ils?


@Bill je pense que vous ne retournez pas les données dans les deux promesses. Alors utilisez celui-ci: $ portée.mydata = objet.Assign ({}, $ Porce.mydata1, $ Porce.mydata2); J'ai édité la réponse



1
votes

Les appels d'URL sont asynchrones, ce qui signifie qu'ils vont courir séparément de la fonction. Avoir l'objet Attribuer après les deux appels, cela se produira après que les appels d'URL sont effectués, mais pas nécessairement après la fin des appels, les deux seules valeurs de données ne seront pas définies. Comme suggéré, il faudra attendre les deux appels à terminer avant qu'il y ait des données pour combiner ensemble et utiliser dans d'autres fonctions


0 commentaires

0
votes

Utiliser $ q.all : xxx

méfiez-vous que les promesses ES6 sont revenues par promess.All ne sont pas intégrés à l'angularjs cadre. AngularJs modifie le flux JavaScript normal en fournissant sa propre boucle de traitement d'événement. Cela scindre le JavaScript dans le contexte d'exécution classique et angularjs. Seules les opérations appliquées dans le contexte d'exécution de l'angularjs bénéficieront de la liaison de données angularjs, de la manipulation des exceptions, de la surveillance de la propriété, etc.

Les promesses retournées par $ q. / code> sont intégrés avec le cadre angularjs.

Pour plus d'informations, voir


0 commentaires