Angular promises:从缓冲区获取数据(如果可用)

时间:2015-01-02 22:43:44

标签: javascript angularjs

在这种情况下,如果数据不在缓冲区中,则要求使用Http请求获取数据。如果它在缓冲区中,请在没有Http请求的情况下从那里使用它。

我尝试了下面的代码,但它没有多大意义;如果数据在缓冲区中,我不知道是否应该从函数返回什么也不做或返回延迟的promise。有什么想法吗?

  var dataBuffer = null;

  var getData = function() {

     var deferred = $q.defer();

     if (dataBuffer != null) {  // this is the part I'm not convinced
         deferred.resolve();
         return;
     }  


     $http.get('/some/url/')
       .success(function(data) { 
               dataBuffer = data;
               deferred.resolve();
       })
       .error(function(data) {
               deferred.reject();
       });

     return deferred.promise;
  };

以下列方式调用:

     var promise = getData();
     promise.then (
           function(response) { 
              dataBuffer = .... // dataBuffer contains data
              }
           );

3 个答案:

答案 0 :(得分:3)

当你不确定你正在执行的代码是异步的时候还有一个使用$q.when时使用promises的简单方法 所以代码可以是:

var getData = function() {
    return $q.when(dataBuffer ? dataBuffer: $http.get('/some/url')) 
};

然后在调用getData时,您可以使用您发布的相同代码,或者只是简单地使用:

getData()
       .then(function(response){//... 
       })
       .catch(function(err){//..
       });

答案 1 :(得分:1)

小心deferred antipattern。你可以非常干净地完成你想要做的事情,如下所示:

var dataBuffer;
var getData = function() {
    if (dataBuffer) {
        // return a resolved promise for  dataBuffer  if it is already populated
        return $q.when(dataBuffer);
    }  

    $http.get('/some/url/')
    .then(function (data) { 
        dataBuffer = data.data;
        return dataBuffer;
    });
};

getData().then(function (data) { 
    // data contains the data you want
})
.catch(function (error) {
    // error occurred.
});

<小时/> 不应在dataBuffer函数之外访问getData。为了使其完全清晰,您可以将它们包装在IIFE中,尽管这是可选的:

var getData = (function () {
    var dataBuffer;
    return function() {
        if (dataBuffer) {
            // return a resolved promise for  dataBuffer  if it is already populated
            return $q.when(dataBuffer);
        }  

        $http.get('/some/url/')
        .then(function (data) { 
            dataBuffer = data.data;
            return dataBuffer;
        });
    };
})();

getData().then(..etc etc etc...);

<小时/> 最后请注意,您可以使用$http的内置缓存功能,而不必使用自己的缓冲区重新发明轮子:

// much simpler, isn't it?
var getData = function() {
    $http.get('/some/url/', { cache: true })  // enable caching
    .then(function (data) { return data.data });
};

getData().then(...etc etc etc...);

答案 2 :(得分:0)

为什么不启用缓存而不是手动处理缓冲区。

   $http.get('/some/url/',{ cache: true})
   .success(function(data) { 
           deferred.resolve(data);
   })
   .error(function(data) {
           deferred.reject();
   });