角度承诺:如果可用,从缓冲区获取数据
Angular promises: get data from buffer if available
在此方案中,如果数据不在缓冲区中,则要求使用 Http 请求获取数据。如果它在缓冲区中,请在没有 Http 请求的情况下从那里使用它。
我尝试了下面的代码,但它没有多大意义;如果数据在缓冲区中,我不知道我是否应该从函数中返回什么都不做或返回延迟的承诺。有什么想法吗?
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
}
);
当您不确定您正在执行的代码是异步的还是非异步的并且它正在使用$q.when
所以代码可以是:
var getData = function() {
return $q.when(dataBuffer ? dataBuffer: $http.get('/some/url'))
};
然后,在调用getData时,您可以使用您发布的相同代码,或者只是简单地:
getData()
.then(function(response){//...
})
.catch(function(err){//..
});
当心延迟的反模式。你可以非常干净地完成你试图做的事情,就像这样:
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.
});
<小时 /> 不应在getData
函数之外访问dataBuffer
。为了清楚地说明这一点,您可以将它们包装在 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...);
为什么不启用缓存而不是手动处理缓冲区。
$http.get('/some/url/',{ cache: true})
.success(function(data) {
deferred.resolve(data);
})
.error(function(data) {
deferred.reject();
});
相关文章:
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- jquery试图按名称获取按钮位置
- 如何在jQuery中获取元素的形式
- 如何在php文件中获取$.post-ajax传递的值
- 在Shopify中获取博客文章的图片
- 使用Javascript获取所选选项ID
- 在jQuery中获取表的行索引
- 使用jquery将mysql数据获取到新的表行中
- 在动态创建的元素上获取对特定选择器的引用
- 从城市名称获取惊喜
- Angular只从数组中获取所需的数据
- 无法将数据从firebase获取到我的html页面
- 从ajax请求中获取javascript对象
- 如何从画布上的某个移动事件中获取X和Y
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- 如何在PHP中使用$_POST获取Select元素值
- 在 nodejs 中用双引号切片缓冲区时获取额外的字符
- 角度承诺:如果可用,从缓冲区获取数据
- 获取node.js将缓冲区作为文件发送
- NodeJS-以二进制/位的形式获取缓冲区对象