我试图找出如何使用$ resource的timeout属性动态取消挂起的请求.理想情况下,我希望能够取消具有某些属性的请求(基于发送的参数),但似乎这可能是不可能的.与此同时,我只是尝试取消所有挂起的请求,然后重置超时承诺以允许新请求.
问题似乎是$ resource配置只允许一个静态的超时值承诺.如果我正在进行单独的$ http调用,那么我可以做到这一点是有道理的,因为我可以为超时传递新的承诺,但是如何才能为$资源工作呢?我在这里设置了一个示例plunker:http://plnkr.co/edit/PP2tqDYXh1NAOU3yqCwP?p = preview
这是我的控制器代码:
app.controller('MainCtrl', function($scope, $timeout, $q, $resource) {
$scope.canceller = $q.defer();
$scope.pending = 0;
$scope.actions = [];
var API = $resource(
'index.html', {}, {
get: {
method: 'GET',
timeout: $scope.canceller.promise
}
}
)
$scope.fetchData = function() {
if ($scope.pending) {
$scope.abortPending();
}
$scope.pending = 1;
$scope.actions.push('request');
API.get({}, function() {
$scope.actions.push('completed');
$scope.pending = 0;
}, function() {
$scope.actions.push('aborted');
});
}
$scope.abortPending = function() {
$scope.canceller.resolve();
$scope.canceller = $q.defer();
}
});
Run Code Online (Sandbox Code Playgroud)
现在,取消器在有待处理的请求时工作,但我似乎无法重置它 - 一旦一个请求被中止,所有将来的请求也将被中止. …
假设我有一个这样的资源设置:
resource = $resource(
"http://foo.com/service/:type/:id",
{},
{save: {method:'PUT', params: {type:'@type', id: '@id'}}}
);
resource.save({type:'user', id:14, name:'Bob Dole'});
Run Code Online (Sandbox Code Playgroud)
有什么方法可以阻止type和id作为请求体的一部分提交,只是发送namePUT有效载荷?我不控制我提交的API,它似乎不喜欢我发送它的额外参数.
谢谢!
更新 - 2013年10月25日 - 13:38
资源文档说:
如果参数值以@为前缀,则从数据对象中提取该参数的值(对非GET操作很有用).
这意味着这应该从数据中删除参数:
resource.save({type:'@user', id:'@14', name:'Bob Dole'});
Run Code Online (Sandbox Code Playgroud)
但它似乎没有用.还是不知所措.
我的笔记本电脑上有一个20 GB的SSD设备,我决定尝试使用bcache.它似乎工作,但一段时间以来,我一直在启动时收到错误:
error on 0f3bbb55-6839-4ed6-8127-7976a969f726: corrupted btree at bucket 17571, block 483, 61 keys, disabling caching
Run Code Online (Sandbox Code Playgroud)
我想我可以尝试修复这个,但我已经决定我可能更好的只是禁用bcache - 我不太了解这可能会丢失数据/头发如果出现问题,我认为我会更好关闭使用分区作为交换更快的冬眠.
我的问题是,如何在不重新格式化支持设备的情况下安全地停止在设备上使用bcache?
我使用/ dev/sda7作为我的后备设备,/ dev/sdb2作为缓存设备(/ dev/sdb1是root).
如果重要的话,我正在使用内核3.13.0-21-generic运行Ubuntu 14.04.
更新:我基本上正在寻找一种能够恢复make-bcache -B所做更改的解决方案.FWIW,我最终通过将所有内容移动到新分区并删除旧分区来解决这个问题(请参阅下面的评论),但我会留下这个问题以防万一有人有实际的解决方案.
似乎很清楚如何设置一个全局方法来中止http请求.有点像
$scope.canceller = $q.defer();
var API = $resource('http:/foo.com', {}, {get: {
method:'GET',
timeout:$scope.canceller.promise
}});
$scope.abortRequests = function() {
$scope.canceller.resolve();
}
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够仅中止特定请求.我可以为我需要能够中止的请求定义单独的资源,但这非常难看.当我调用可以允许超时有条件的$ resource时,有什么方法可以传入参数或其他东西吗?也许是这样的:
var API = $resource('http:/foo.com', {}, {get: {
method:'GET',
timeout:function() { if (FOO) { return $scope.canceller.promise; }}
}});
Run Code Online (Sandbox Code Playgroud)
但是如何访问FOO?
感谢您的任何见解!