Javascript 角度承诺多次

Javascript 角度承诺多次,javascript,angularjs,Javascript,Angularjs,我试图复制一个类似couchDB的系统。 我的后端是解析服务器,前端是爱奥尼亚(1) 我试图实现的是使用localstorage加快我的应用程序 目前: GetUserAds ->有本地存储吗 -->对 --->返回本地存储 -->没有 --->获取数据库调用 ---->返回并放置本地 但我真正想要的是本地返回,在后台获取数据库,并在数据发生更改时返回该数据 这是因为我的应用程序有很多用户,而且变化很大 我可以这样做吗 getUserAds(user).then(function(data) {

我试图复制一个类似couchDB的系统。 我的后端是解析服务器,前端是爱奥尼亚(1)

我试图实现的是使用localstorage加快我的应用程序

目前: GetUserAds

->有本地存储吗

-->对

--->返回本地存储

-->没有

--->获取数据库调用

---->返回并放置本地

但我真正想要的是本地返回,在后台获取数据库,并在数据发生更改时返回该数据

这是因为我的应用程序有很多用户,而且变化很大

我可以这样做吗

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

如果从Angular API使用此服务,则可以执行此操作:

我会这样做:

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

通过这种方式,您可以像在线通信一样使用本地通信,并且可以简化您的逻辑。

您可以使用以下网站上提供的
notify
回调:

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
  };
}
在你的控制器里

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

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

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

在这里您可以看到一个小JSIDLE:

您应该仔细看看RxJS的可观察性,基本上这是一个可以多次解析的承诺,适合您的需要。你也可以使用object,我在一个项目中这样做了,我有一个用户对象,它被localStorage填充,然后我进行API调用,因为它是一个对象,API答案更改的属性在我的对象使用的任何地方都会更改。您好,感谢您的回复,现在查看rxjs,但我只找到了ES6或Angular2。你有关于这些物体的更多信息吗?不确定你的意思。RxJS Observable已经取代了angular2中的promise。这就是为什么你会在它上面找到很多与angular2相关的资源。是一段关于Ben Lesh的youtube视频,解释了它的工作原理。对于对象部分,我想到了一个用户对象
{name:'fougere',…}
,它使用一个函数getUserAds存储用户信息,该函数只从存储器(cache/database/which)获取数据。这实际上是我现在使用它的方式,但该方法只能返回1次,这可能会导致本地数据丢失。哦,对不起,我误解了你的问题。你想让你的getLocalData也尝试getDataDB吗?是的,正确,所以首先获取本地数据以提高速度,但也要获取db数据并在获得该数据后进行更新。注意!仅就我的信息而言,通知就像是一个临时解决方案?从文档中可以看出:“此外,在承诺得到解决或拒绝之前,通知回调可能被调用零次或多次以提供进度指示。”本质上,你可以给任何等待承诺完成的人打电话,公布承诺的进度,当然,在解决承诺之前,您可以根据需要进行多次。非常感谢您的帮助,这看起来像是新的观察模式,但工作起来很有魅力。