2016-03-25 9 views
3

Ich versuche, ein SofaDB ähnliches System zu replizieren. Mein Backend ist Parse Server und mein Frontend ist Ionic (1)Winkelversprechen mehrmals

Was ich versuche zu erreichen, ist meine Anwendung mit Localstorage zu befestigen.

Derzeit: GetUserAds

-> Hat local?

-> Ja

---> Zurück local

-> Kein

---> Datenbank-Aufruf Get

----> Return und setzen lokale

Aber was ich wirklich möchte, ist die lokale Rückkehr, um die Datenbank im Hintergrund zu holen und diese Daten auch zurückzugeben, wenn es sich ändert

Dies ist, weil meine Anwendung viele Benutzer hat und viel ändert.

Konnte ich so etwas tun.

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

Sie enventualy a nehmen sollte Schauen Sie sich das Observable of RxJS an. Es ist ein Versprechen, dass Sie mehrere Male auflösen können, was Ihnen passt. Sie können auch ein Objekt verwenden, ich habe das in einem Projekt gemacht, ich habe ein Benutzerobjekt, das von localStorage gefüllt wird, dann mache ich meine API-Aufrufe, weil es ein Objekt ist, dessen Attribute durch die API-Antwort geändert werden, überall wo mein Objekt verwendet wird. – Fougere

+0

Hallo danke für die Antwort, schau jetzt in rxjs, aber alles, was ich finde, ist ES6 oder Angular2. Haben Sie mehr Informationen zu den Objekten? nicht sicher, was du damit meinst. – Rebelchris

+0

RxJS Observable hat Versprechen in angular2 ersetzt, deshalb finden Sie eine Menge Ressourcen in Bezug auf angular2. [hier] (https://youtu.be/KOOT7BArVHQ) ist ein Youtube-Video von Ben Lesh, das erklärt, wie es funktioniert. Für den Objektteil habe ich an ein Benutzerobjekt '{name: 'fougere', ...}' gedacht, das Ihre Benutzerinformationen mit einer Funktion getUserAds speichert, die einfach die Daten vom Speicher (Cache/Datenbank/was auch immer) erhält. – Fougere

Antwort

2

könnten Sie verwenden den notify Rückruf bei Winkel Versprechungen zur Verfügung gestellt:

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

und in Ihrem Controller

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

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

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

Hier können Sie ein wenig jsfiddle sehen: http://jsfiddle.net/Lvc0u55v/1596/

+0

Spot auf! Nur für meine Info, die Benachrichtigung ist wie eine temporäre Lösung? – Rebelchris

+0

Aus der Dokumentation: "Darüber hinaus kann der Notify-Rückruf null oder mehrmals aufgerufen werden, um eine Fortschrittsanzeige bereitzustellen, bevor das Versprechen aufgelöst oder zurückgewiesen wird." Im Wesentlichen können Sie anrufen, wer auf Ihr Versprechen wartet, um den Fortschritt Ihres Versprechens zu veröffentlichen, so oft Sie brauchen, natürlich bevor Sie das Versprechen lösen. – Daniele

+0

Danke wirklich hilfreich, das sieht tatsächlich wie das neue Beobachtungsmuster aus, funktioniert aber wie ein Zauber. – Rebelchris

0

Sie tun können, dass, wenn Sie diesen Service aus der Angular API: Angular Promises. Diese

ist, wie ich es tun würde:

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! 
} 

Auf diese Weise kann die lokale Kommunikation genauso wie Online-Kommunikation verwenden und Sie können Ihre Logik zu vereinfachen.

+0

Dies ist eigentlich, wie ich es gerade jetzt verwende, aber diese Methode kann nur 1 Mal zurück, was dazu führen kann, dass die lokalen Daten aus Daten sein .. – Rebelchris

+0

Oh, tut mir leid, ich habe Ihre Frage missverstanden. Möchten Sie, dass Ihre getLocalData auch eine getDataDB ausprobiert? – davidRA

+0

Ja richtig, also zuerst lokal für die Geschwindigkeit, aber auch db Daten und aktualisieren, sobald Sie das bekommen. – Rebelchris