Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
gitlab-foss
提交
dc058e15
G
gitlab-foss
项目概览
李少辉-开发者
/
gitlab-foss
通知
15
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gitlab-foss
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
dc058e15
编写于
3月 23, 2017
作者:
F
Fatih Acet
浏览文件
操作
浏览文件
下载
差异文件
Merge branch '29575-polling' into 'master'
Poll with vue resource get function Closes #29575 See merge request !10057
上级
1bb1a75a
45b2c63f
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
193 addition
and
0 deletion
+193
-0
app/assets/javascripts/lib/utils/poll.js
app/assets/javascripts/lib/utils/poll.js
+62
-0
changelogs/unreleased/29575-polling.yml
changelogs/unreleased/29575-polling.yml
+4
-0
spec/javascripts/lib/utils/poll_spec.js
spec/javascripts/lib/utils/poll_spec.js
+127
-0
未找到文件。
app/assets/javascripts/lib/utils/poll.js
0 → 100644
浏览文件 @
dc058e15
import
httpStatusCodes
from
'
./http_status
'
;
/**
* Polling utility for handling realtime updates.
* Service for vue resouce and method need to be provided as props
*
* @example
* new poll({
* resource: resource,
* method: 'name',
* data: {page: 1, scope: 'all'},
* successCallback: () => {},
* errorCallback: () => {},
* }).makeRequest();
*
* this.service = new BoardsService(endpoint);
* new poll({
* resource: this.service,
* method: 'get',
* data: {page: 1, scope: 'all'},
* successCallback: () => {},
* errorCallback: () => {},
* }).makeRequest();
*
*
* 1. Checks for response and headers before start polling
* 2. Interval is provided by `Poll-Interval` header.
* 3. If `Poll-Interval` is -1, we stop polling
* 4. If HTTP response is 200, we poll.
* 5. If HTTP response is different from 200, we stop polling.
*
*/
export
default
class
Poll
{
constructor
(
options
=
{})
{
this
.
options
=
options
;
this
.
options
.
data
=
options
.
data
||
{};
this
.
intervalHeader
=
'
POLL-INTERVAL
'
;
}
checkConditions
(
response
)
{
const
headers
=
gl
.
utils
.
normalizeHeaders
(
response
.
headers
);
const
pollInterval
=
headers
[
this
.
intervalHeader
];
if
(
pollInterval
>
0
&&
response
.
status
===
httpStatusCodes
.
OK
)
{
this
.
options
.
successCallback
(
response
);
setTimeout
(()
=>
{
this
.
makeRequest
();
},
pollInterval
);
}
else
{
this
.
options
.
successCallback
(
response
);
}
}
makeRequest
()
{
const
{
resource
,
method
,
data
,
errorCallback
}
=
this
.
options
;
return
resource
[
method
](
data
)
.
then
(
response
=>
this
.
checkConditions
(
response
))
.
catch
(
error
=>
errorCallback
(
error
));
}
}
changelogs/unreleased/29575-polling.yml
0 → 100644
浏览文件 @
dc058e15
---
title
:
Adds polling utility function for vue resource
merge_request
:
author
:
spec/javascripts/lib/utils/poll_spec.js
0 → 100644
浏览文件 @
dc058e15
import
Vue
from
'
vue
'
;
import
VueResource
from
'
vue-resource
'
;
import
Poll
from
'
~/lib/utils/poll
'
;
Vue
.
use
(
VueResource
);
class
ServiceMock
{
constructor
(
endpoint
)
{
this
.
service
=
Vue
.
resource
(
endpoint
);
}
fetch
()
{
return
this
.
service
.
get
();
}
}
describe
(
'
Poll
'
,
()
=>
{
let
callbacks
;
beforeEach
(()
=>
{
callbacks
=
{
success
:
()
=>
{},
error
:
()
=>
{},
};
spyOn
(
callbacks
,
'
success
'
);
spyOn
(
callbacks
,
'
error
'
);
});
it
(
'
calls the success callback when no header for interval is provided
'
,
(
done
)
=>
{
const
successInterceptor
=
(
request
,
next
)
=>
{
next
(
request
.
respondWith
(
JSON
.
stringify
([]),
{
status
:
200
}));
};
Vue
.
http
.
interceptors
.
push
(
successInterceptor
);
new
Poll
({
resource
:
new
ServiceMock
(
'
endpoint
'
),
method
:
'
fetch
'
,
successCallback
:
callbacks
.
success
,
errorCallback
:
callbacks
.
error
,
}).
makeRequest
();
setTimeout
(()
=>
{
expect
(
callbacks
.
success
).
toHaveBeenCalled
();
expect
(
callbacks
.
error
).
not
.
toHaveBeenCalled
();
done
();
},
0
);
Vue
.
http
.
interceptors
=
_
.
without
(
Vue
.
http
.
interceptors
,
successInterceptor
);
});
it
(
'
calls the error callback whe the http request returns an error
'
,
(
done
)
=>
{
const
errorInterceptor
=
(
request
,
next
)
=>
{
next
(
request
.
respondWith
(
JSON
.
stringify
([]),
{
status
:
500
}));
};
Vue
.
http
.
interceptors
.
push
(
errorInterceptor
);
new
Poll
({
resource
:
new
ServiceMock
(
'
endpoint
'
),
method
:
'
fetch
'
,
successCallback
:
callbacks
.
success
,
errorCallback
:
callbacks
.
error
,
}).
makeRequest
();
setTimeout
(()
=>
{
expect
(
callbacks
.
success
).
not
.
toHaveBeenCalled
();
expect
(
callbacks
.
error
).
toHaveBeenCalled
();
done
();
},
0
);
Vue
.
http
.
interceptors
=
_
.
without
(
Vue
.
http
.
interceptors
,
errorInterceptor
);
});
it
(
'
should call the success callback when the interval header is -1
'
,
(
done
)
=>
{
const
intervalInterceptor
=
(
request
,
next
)
=>
{
next
(
request
.
respondWith
(
JSON
.
stringify
([]),
{
status
:
200
,
headers
:
{
'
poll-interval
'
:
-
1
}
}));
};
Vue
.
http
.
interceptors
.
push
(
intervalInterceptor
);
new
Poll
({
resource
:
new
ServiceMock
(
'
endpoint
'
),
method
:
'
fetch
'
,
successCallback
:
callbacks
.
success
,
errorCallback
:
callbacks
.
error
,
}).
makeRequest
();
setTimeout
(()
=>
{
expect
(
callbacks
.
success
).
toHaveBeenCalled
();
expect
(
callbacks
.
error
).
not
.
toHaveBeenCalled
();
done
();
},
0
);
Vue
.
http
.
interceptors
=
_
.
without
(
Vue
.
http
.
interceptors
,
intervalInterceptor
);
});
it
(
'
starts polling when http status is 200 and interval header is provided
'
,
(
done
)
=>
{
const
pollInterceptor
=
(
request
,
next
)
=>
{
next
(
request
.
respondWith
(
JSON
.
stringify
([]),
{
status
:
200
,
headers
:
{
'
poll-interval
'
:
2
}
}));
};
Vue
.
http
.
interceptors
.
push
(
pollInterceptor
);
const
service
=
new
ServiceMock
(
'
endpoint
'
);
spyOn
(
service
,
'
fetch
'
).
and
.
callThrough
();
new
Poll
({
resource
:
service
,
method
:
'
fetch
'
,
data
:
{
page
:
1
},
successCallback
:
callbacks
.
success
,
errorCallback
:
callbacks
.
error
,
}).
makeRequest
();
setTimeout
(()
=>
{
expect
(
service
.
fetch
.
calls
.
count
()).
toEqual
(
2
);
expect
(
service
.
fetch
).
toHaveBeenCalledWith
({
page
:
1
});
expect
(
callbacks
.
success
).
toHaveBeenCalled
();
expect
(
callbacks
.
error
).
not
.
toHaveBeenCalled
();
done
();
},
5
);
Vue
.
http
.
interceptors
=
_
.
without
(
Vue
.
http
.
interceptors
,
pollInterceptor
);
});
});
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录