2016-04-14 15 views
1

Büyük bir denetleyicide, veri tabanından veriye güveniyorum. Bu veri, durum tanımı içinde resolve kullanılarak alınır. Ancak, nadir ve özel durumlarda, ana veritabanından veri yoktur ve başka bir veritabanından varsayılan verileri kullanmam gerekir (yüklenmesi biraz zaman alır). Elbette, hiçbir şekilde, varsayılan veriler her seferinde yüklenmelidir, ancak sadece bu nadir durumlarda, bu gereklidir. Bu nedenle, varsayılan tanımı resolve'u kullanarak durum tanımında yükleme seçeneği yoktur, bence.Yalnızca özel durumda eşzamansız olarak doldurulan değişken

Yani, basit bir if-else-deyimini kullanmam gerekiyor, yalnızca varsayılan verileri resolve tarafından getirilen "normal" veriler başarıyla yüklenmemişse almam gerekiyor. Varsayılan veriler daha sonra geri arama ile bir servis fonksiyonu ile alınır. Benim geçerli kod böyle benziyor: Ben asenkron davranışı ile derde çalıştırıyorum çünkü

Tabii
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 

, bu, işe yaramaz. Burada bir söz kullanması tavsiye edildi, ancak tüm sözler bana else ifadesinin içine koyacağınız kodu koymak için başka bir tür geri arama fonksiyonu ile bana sağlayacaktır. Ancak, bu, tüm denetleyiciyi (bu da beni biraz sıkıntıya sokacak olan) yeniden hesaplamak anlamına geliyordu.

else deyimi içine doldurulan ediliyor $scope.myMainVariable kadar komut bekleme yürütülmesini yapmak için zarif bir yolu var mı ve sonrasında else deyimi dışında $scope.myMainVariable kullanılır?

+0

Eğer kumanda içinde tüm fonksiyonunun daha kod parçacığını sağlayabilir? sadece if-else durumu değil. –

cevap

2

doğrudur. Bir söz kullanmak için tek seçenek. Basitçe, bu gibi elde edebilirsiniz: Kumandanızda içinde veya herhangi bir yerde Şimdi

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

, böyle yazabilirsiniz:

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

Bir $q.when() içinde dataLoadedViaResolve sarabilirdiniz, bu o zaman yapabileceğini, $scope.myMainVariable bir söz olacaktır:

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

Şey, kastettiğim: "Verilerimde bir şeyler yap" işlevini başka bir çift parantez içindeki işlevsellikten kaçınmak, kaçınmak istediğim bir şey. Ve çözümünüz tam olarak bunu gerektirirdi. Yine de teşekkürler! – cis

+0

@cis Varsayılan veriyi her zaman çözmek istemediğiniz sürece, bir söz kullanmak yerine başka bir şey yapamazsınız –

1

Böyle bir şey yapabileceğini:

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

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

Bu ne değişti? '$ scope.myMainVariable' zaten 'else' ifadesi içinde geri arama işlevi içinde doğru şekilde ayarlanmış, ancak bunun dışında," undefined "olsun. Vaat ve $ q.defer kullanmak için de aynı şey geçerlidir. – cis

İlgili konular