2017-05-10 5 views
0

私は2つの非同期関数を持っています。それらのうちの1つを既にrouteProviderの解決セクションに解決する必要があります。ユーザーがURLにオブジェクトを入力すると、開始日と終了日が自動的に追加されます。私の問題は、日付が遅く解決されたことです。コントローラーでconsole.log(datetable)を実行すると、dobjectが正しく解決されたことが示されるためです。しかし、これは遅いです、私は変数がnullのため、/ object/startdate/enddateではなく、/ object(404を生成する)を検索しているので、ObjectService.get()を呼び出す日付も必要です。 ObjectService.get()を呼び出す前に日付を解決するにはどうすればよいですか?すでにrouteproviderにある非同期変数の解決

私の工場やサービスメソッド

.factory("ObjectService", ["$resource", function($resource) { 
       return $resource('/:object/:startdate/:enddate'); 
      }]) 
      .service("CurrentDates", ["DateService", function(DateService) { 
       this.dates = function() { 

        DateService.query().$promise.then(function(info) { 
         currentdates.startdate = info.start; 
         currentdates.enddate = info.end; 
        }).catch(onError); 
        return currentdates; 
       } 
      }]) 

      .factory("DateService", ["$resource", function($resource) { 
       return $resource('dates.json'); 
      }]) 

マイRouteprovider

$routeProvider 
      .when('/:object', { 
       templateUrl: "template/table.html", 
       controller: 'ObjectController', 
       resolve: { 
        datetable: ["ObjectService", "CurrentDates", "$route", 
         function(ObjectService, CurrentDates, $route) { 
          var dates = CurrentDates.dates(); // dates should already be resolved here if possible 
          return ObjectService.get(Object.assign($route.current.params, dates)).$promise 
           .catch(function(errorResponse) { 
            return { 
             "error": errorResponse.status, 
             "object": $route.current.params.object, 
             "dobject": Object.assign($route.current.params, dates) 
            }; 
           }); 
         } 
        ], 
       } 
      }) 

私はこのようにそれを書くことを試みたが、それは仕事をdidntの。

return CurrentDates.dates().then(function(dates) { 
    return ObjectService.get(Object.assign($route.current.params, dates)) 
     .$promise.catch(function(errorResponse) { 
      return { 
       "error": errorResponse.status, 
       "object": $route.current.params.object, 
       "dobject": Object.assign($route.current.params, dates) 
      }; 
     }); 
}) 
+0

:その後、私はrouteProviderで変数のDataTableを解決することができ

.service("CurrentDates", ["DateService", function(DateService) { var currentdates = { startdate: null, enddate: null }; this.dates = function() { return DateService.query().$promise.then(function(info) { currentdates.startdate = info.start; currentdates.enddate = info.end; return currentdates; }).catch(onError); } }]) 

:私はに私のserviceメソッドを書き換える必要がありました。それはタイプミスかもしれないし、あなたは 'CurrentDates.dates()'を意味するかもしれない。しかし、その関数は約束を返していないので、 'DateService.query'が非同期部分であるため、空のオブジェクトを返しています。 'resolve'は約束オブジェクトを受け取る必要があります。つまり、あなたのサービスの' .then'はラップする必要があります。そうでなければ、 '.then'ロジックを別の場所で実行する必要があります。 – Claies

+0

あなたはそこに私を持って、間違いを修正しました。 「当時」について、私は問題がそういうものだと思った。私はちょうどそれを正確に行う方法がわかりませんが、あなたの答えは私が問題をより良く理解するのに役立ちます。 – member2

答えて

0

私はClaiesのヒントのおかげでそれをやった。 `CurrentDates`は`現在の() `関数を持っているように見えていません

datetable:  ["ObjectService", "CurrentDates", "$route", 
      function(ObjectService, CurrentDates, $route) { 
       return CurrentDates.dates().then(function(dates) { 
        return ObjectService.get(Object.assign($route.current.params, dates)) 
         .$promise.catch(function(errorResponse) { 
          return { 
           "error": errorResponse.status, 
           "object": $route.current.params.object, 
           "dobject": Object.assign($route.current.params, dates) 
          }; 
         }); 
       }) 
      ] 
関連する問題