2016-03-25 28 views
3

couchDB benzeri bir sistemi çoğaltmaya çalışıyorum. Arka uç Parse sunucusu ve ön uçım Ionic (0)Açısal vaat birden çok kez

Neyi başarmaya çalışıyorum başvurumu localstorage ile sabitlemektir.

Şu: GetUserAds

-> localStorage etti mi?

-> Evet

---> Dönüş localStorage

-> Hayır

---> veritabanı çağrı

----> Dönüş alın ve yerel koymak

Ama gerçekten istediğim, veritabanını arka planda getirme ve bu verileri

değiştirildiyse döndür

Bunun nedeni, uygulamamın birçok kullanıcısı olması ve çok şey değişmesidir.

Böyle bir şey yapabilir miyim? Sen yapabilirsin

getUserAds(user).then(function(data) { 
//Local data 
}).then(function(dataDB) { 
//Database updated data 
}) 
+0

RxJS'nin Gözlemlenebilir'ine bakmanızın temel olarak, ihtiyacınıza uygun olan birçok kez çözülebilmesidir. Nesneyi de kullanabilirsiniz, bunu bir projede yaptım, localStorage tarafından doldurulmuş bir kullanıcı nesnesine sahibim, sonra API çağrılarımı yapıyorum çünkü bir nesne, API yanıtı tarafından değiştirilen öznitelikler, nesnemin kullanıldığı her yerde değişiyor. – Fougere

+0

Merhaba, yanıt için teşekkürler, şimdi rxjs'ye bakıyorum, ama tek bulduğum ES6 veya Angular2. Nesneler hakkında daha fazla bilgi var mı? Ne demek istediğinden emin değilim. – Rebelchris

+0

RxJS Observable, angular2'deki sözünü değiştirdi, bu yüzden angular2 ile ilgili birçok ressource bulursun. [burada] (https://youtu.be/KOOT7BArVHQ), Ben Lesh'in nasıl çalıştığını açıklayan bir youtube videosu. Nesne kısmı için, kullanıcı bilgilerini, veriyi depoya (önbellek/veritabanı/her neyse) alan getUserAds işleviyle kaydeden bir Kullanıcı Nesnesi '' name '' fougere ', ...} 'ı düşünüyordum. – Fougere

cevap

2

Sen açısal sözlerini sağlanan notify geri arama kullanabilirsiniz:

function UserService($timeout, $q) { 
    var users = ["user1", "user2"]; //localStorage.getItem('users'); 
    function get() { 
    var deferred = $q.defer(); 
    //call your backend here $http.get('....') 
    $timeout(function() { 
     //if(remoteUsers !== users) { 
       deferred.resolve({local: false, users: users.concat('user3')}); 
     //} 

    }, 3000); 
    $timeout(function() { 
    if(users) { 
     deferred.notify({local: true, users: users}); 
    } 

    }, 100) 

    return deferred.promise; 
    } 

    return { 
    get: get 
    }; 
} 

ve denetleyici içinde

İşte
function MyCtrl($scope, $users) { 
    $scope.name = 'Superhero'; 
    $scope.myUsers = []; 

    $users.get() 
     .then(setUsers, null, setUsers); 

    function setUsers(users) { 
     $scope.myUsers = users; 
     } 
} 

biraz jsfiddle görebilirsiniz: Sen enventualy bir almalı http://jsfiddle.net/Lvc0u55v/1596/

+0

Spot on! Sadece bilgi için, notif geçici bir çözüm gibi mi? – Rebelchris

+0

Belgelerden: "Ayrıca, söz konusu bildirim çözülmeden veya reddedilmeden önce, bir geri bildirim bildirimi sağlamak için bildirim çağrısı sıfır veya daha fazla kez çağrılabilir." Temelde, sözünü yerine getirmeden önce, sözünü tutmadan önce, söz verdiğiniz sözün ilerleyişini yayınlamak için, vaat ettiğinizin çoğunu beklediğiniz gibi arayabilirsiniz. – Daniele

+0

Gerçekten çok yardımcı oldum, bu aslında yeni gözlem desenine benziyor, ama bir çekicilik gibi çalışıyor. – Rebelchris

0

o size Açısal API gelen bu hizmetten yararlanmak: Angular Promises.

Bu bunu yapmak görecektir:

getUserAds(user).then(function(response) { 
    // useMyData 
}); 

function getUserAds { 
    if(thereIsLocalData) { 
     return getLocalData(); // this returns a $q promise 
    } else { 
     return getDataDB() // Here I'm returning an $http Promise 
    } 
} 

function getDataDB (params) { 
    return $http.get(host, params, {}); // I'm returning the $http Promise! 
} 

function getLocalData (params) { 
    return $q(function(resolve, reject) { 
     resolve(myLocalData); 
    }); // return the $q promise! 
} 

Bu şekilde Çevrimiçi iletişim gibi yerel iletişimlerini aynı şekilde kullanıyorsanız ve mantık kolaylaştırabilir.

+0

Aslında şu an bunu nasıl kullanıyorum, ancak bu yöntem yalnızca 1 kez geri dönebilir, bu da yerel verilerin veri dışına çıkmasına neden olabilir .. – Rebelchris

+0

Oh, üzgünüm, sorunuzu yanlış anladım. GetLocalData'nızın getDataDB'yi denemesini mi istiyorsunuz? – davidRA

+0

Evet, yani hız için önce yerel alın, ancak bunu aldıktan sonra db verilerini alın ve güncelleyin. – Rebelchris

İlgili konular