2016-04-14 6 views
1

巨大なコントローラの中で、私はデータベースのデータに頼っています。このデータは、状態定義内でresolveを使用して取得されます。 しかし、まれで特殊なケースでは、メインデータベースのデータがなく、別のデータベースのデフォルトデータを使用する必要があります(ロードに時間がかかります)。もちろん、決してデフォルトデータをロードする必要はありませんが、まれにしか必要ではありません。したがって、状態定義にresolveを使用してデフォルトデータをロードすることもオプションではないと私は思います。特別な場合にのみ非同期にデータを取り込む変数

したがって、resolveによってフェッチされた「通常の」データが正常に読み込まれなかった場合にのみ、デフォルトのデータを取得する単純なif-else-statementを使用する必要があります。デフォルトのデータは、コールバック付きのサービス関数で取得されます。私の現在のコードは、このような次のようになります。もちろん

if (dataLoadedViaResolve.success){ 
    $scope.myMainVariable = dataLoadedViaResolve; 
} else { 
    myService.getDefaults(function(data){ 
     $scope.myMainVariable = data; 
    }); 
} 

// Do a lot of things with $scope.myMainVariable in hundreds of lines of code 

私は非同期動作とトラブルに実行しているので、これは、動作しません。私はここで約束を使用することを勧められましたが、結局のところ、elseステートメント内で実行されるコードを入れるための別の種類のコールバック関数を私に提供することになりました。しかし、それはコントローラー全体をリファクタリングすることを意味するでしょう(それは私をいくらか困らせるでしょう)。

else文の内側に取​​り込まれている$scope.myMainVariableまでスクリプト待ちの実行を作るためにエレガントな方法ですし、その後、その後else文の外$scope.myMainVariableを使うのか?あなたは$q.when()dataLoadedViaResolveをラップすることができ

+0

あなたは、コントローラにあなたの全体の機能の多くのコードスニペットを提供することができますか? if-else条件だけではありません。 –

答えて

2

真を。唯一の選択肢は、約束を使用する必要があります。あなたは、単にこのようにそれを達成することができます:今

$scope.getMyMainVar = function() { 
    var defer = $q.defer(); 
    var myMainVariable; 

    if (dataLoadedViaResolve.success) { 
     defer.resolve({myMainVariable: dataLoadedViaResolve}); 
    } else { 
     myService.getDefaults(function(data) { 
      defer.resolve({myMainVariable: data}); 
     }); 
    } 

    return defer.promise; 
}; 

、お使いのコントローラまたはどこかの内側に、あなたは次のように書くことができます。

$scope.getMyMainVar().then(function(data) { 
    $scope.myMainVariable = myMainVariable; 
    // Do a lot of things with $scope.myMainVariable in hundreds of lines of code 
}); 
2

、これは$scope.myMainVariable約束を作り、その後、あなたが行うことができます:

$scope.myMainVariable 
    .then(function(data) { 
     // Do something with your data 
    } 
); 
+0

まあ、私の意味は次のとおりです。別の中括弧の中にある "データ内の何かを行う"機能をすべてラップすることは、私が避けたいものです。そして、あなたのソリューションはまさにこれを必要とします。とにかくありがとう! – cis

+0

@cisいつもデフォルトのデータを解決したいのでなければ、約束をする以外に他のことはできません。 –

1

あなたはこのような何か行うことができます:

if(dataLoadedViaResolve.success){ 
    $scope.myMainVariable = dataLoadedViaResolve; 
} 

else { 
    myService.getDefaults().then(function(data){ 
    $scope.myMainVariable = data; 
}); 
} 
+0

何が変わるのですか? '$ scope.myMainVariable'は' else'ステートメント内のコールバック関数内ですでに正しく設定されていますが、その外には "未定義"があります。 promiseと$ q.deferの使用についても同じです。 – cis

関連する問題