2016-12-22 2 views
0

Ich habe 2 http Aufrufe Reslove vor der Initialisierung meines Controllers, derzeit mit Angular UI Router benötigt und ich habe Karte unter $ stateProvider.state ('stateName', {stateObject}) zu lösen mein stateobject als GebrüllLösen Sie mehrere Versprechen in Route Auflösung vor der Initialisierung Controller

$stateProvider.state('stateName', { 
     url : '/myURL', 
     params: { 
       data1: undefined, 
       data2 : undefined 
      }, 
     resolve: { 
      dataTobeResolve : function($stateParams,$q) { 

       var deferred = $q.defer(); 
       var deferredObj = {}; 
       deferredObj.d1 = $q.defer(); 
       deferredObj.d2 = $q.defer(); 

       var result = { 
        data1: {}, 
        data2: {} 
       } 

       if(angular.isDefined($stateParams.data1)) { 
        result.data1 = $stateParams.data1; 
        deferredObj.d1.resolve(); 
       } 
       else { 
        httpCall().then(function(response) { 
         AsyncMethodCall(response.data).then(function(resolvedData) { 
          result.data1 = resolvedData; 
          deferredObj.d1.resolve();  
         }); 
        }); 
       } 

       if(angular.isDefined($stateParams.data2)) { 
        result.data2 = $stateParams.data2; 
        deferredObj.d2.resolve(); 
       } 
       else { 
        AsyncMethodCall().then(function(resolvedData) { 
         result.data2 = resolvedData; 
         deferredObj.d2.resolve();  
        }); 
       } 

       $q.all(deferredObj).then(function() { 
        deferred.resolve(result); 
       }); 
       return deferred.promise; 
      } 
     } 
    }); 

wie immer trotz der deferredObj.d1 controll geht entschlossen zu sein, um dann (function() {}) von $ q.all (deferredObj), die unerwartete Verhalten ist, und ich glaube, dass alle von der Verheißungskarten von deferredObj sollten aufgelöst werden, bevor diese Zeile ausgeführt wird, mein Controller wird initialisiert, obwohl eines der Versprechen gelöst wurde.

Antwort

0

Ich habe das Problem gefunden und es ist aufgrund der Übergabe verzögerte Objekt in $ q.all() statt Hash/Array von Versprechen. so folgender Code wird das Problem

$stateProvider.state('stateName', { 
    url : '/myURL', 
    params: { 
      data1: undefined, 
      data2 : undefined 
     }, 
    resolve: { 
     dataTobeResolve : function($stateParams,$q) { 

      var deferred = $q.defer(); 
      var promises = {}; 
      var d1 = $q.defer(); 
      var d2 = $q.defer(); 
      promises.d1 = d1.promise; 
      promises.d2 = d2.promise; 

      var result = { 
       data1: {}, 
       data2: {} 
      } 

      if(angular.isDefined($stateParams.data1)) { 
       result.data1 = $stateParams.data1; 
       d1.resolve(); 
      } 
      else { 
       httpCall().then(function(response) { 
        AsyncMethodCall(response.data).then(function(resolvedData) { 
         result.data1 = resolvedData; 
         d1.resolve();  
        }); 
       }); 
      } 

      if(angular.isDefined($stateParams.data2)) { 
       result.data2 = $stateParams.data2; 
       d2.resolve(); 
      } 
      else { 
       AsyncMethodCall().then(function(resolvedData) { 
        result.data2 = resolvedData; 
        d2.resolve();  
       }); 
      } 

      $q.all(promises).then(function() { 
       deferred.resolve(result); 
      }); 
      return deferred.promise; 
     } 
    } 
}); 

lösen, aber immer noch ich schätzen, wenn jemand

1

Da $q.all bessere Lösung bieten, $http und die .then Methode all Rückkehr Versprechungen, die nicht notwendig ist, ein Versprechen mit der Herstellung $q.defer. Verwenden Sie nur $q.defer, um Versprechungen von asynchronen APIs im Nur-Callback-Modus zu machen.

Verwenden Sie $q.when, um eine Zusage von einer synchronen Quelle oder von einem Versprechen außerhalb des AngularJS-Frameworks zu geben.

resolve: { 
    dataTobeResolve : function($stateParams,$q) { 

     var d1Promise; 
     var d2Promise; 

     if(angular.isDefined($stateParams.data1)) { 
      d1Promise = $q.when($stateParams.data1); 
     } 
     else { 
      d1Promise = httpCall() 
       .then(function(response) { 
        return response.data; 
      }); 
     } 

     if(angular.isDefined($stateParams.data2)) { 
      d2Promise = $q.when($stateParams.data2) 
     } 
     else { 
      d2Promise = httpCall2() 
       .then(function(response) { 
        return response.data;  
      }); 
     } 

     return $q.all([d1Promise, d2Promise]); 
    } 
} 

In dem obigen Beispiel werden zwei Zusagen entweder $ Frage: Wann eines Parameters oder abgeleitet von einem Versprechen basierte asynchrone API erstellt. Aus den beiden Versprechen mit der Methode $q.all ergibt sich ein zusammengesetztes Versprechen.

Die Verwendung abgeleiteter Versprechen hat den Vorteil, dass Ablehnungen automatisch auf das endgültige Versprechen übertragen werden. Wie derzeit geschrieben, hängt die $q.defer Methode die Statusänderung auf, wenn einer der XHR-Aufrufe einen Fehler vom Server hat.

Verwandte Themen