tencent-qqnews-user
Version:
用于在腾讯新闻客户端中进行登录、获取用户信息和提交请求等操作
159 lines (141 loc) • 3.72 kB
JavaScript
import {os} from './common';
/**
* 新闻客户端内的请求
*/
async function newsPost({
url='',
data={},
success=()=>{},
error=()=>{},
complete=()=>{}
}){
await this.ready();
let postCallBack = 'postCallBack'+this.counter;
let errorCallback = 'errorCallback'+this.counter;
this.counter++;
let result = new Promise((resolve, reject)=>{
window[errorCallback] = ()=>{
error( new Error('url: '+url+' post error'), url );
reject( new Error('url: '+url+' post error'), url );
complete( new Error('url: '+url+' post error'), url );
this.postError( new Error('url: '+url+' post error'), url );
delete window[errorCallback];
delete window[postCallBack];
};
window[postCallBack] = (result, cc)=>{
if( !os.android ){
if( !result ){
window[errorCallback]();
return false;
}else{
result = cc;
}
}
success( JSON.parse(result) );
resolve( JSON.parse(result) );
complete( null, url, JSON.parse(result) );
this.postSuccess( null, url, JSON.parse(result) );
delete window[postCallBack];
delete window[errorCallback];
};
});
if( !os.android ){
window.TencentNews.post && window.TencentNews.post(url, data, window[postCallBack], {'loginType':'qqorweixin'}, {});
}else{
window.TencentNews.postData && window.TencentNews.postData(url, JSON.stringify(data), postCallBack, errorCallback);
}
return result;
}
/**
* 网页端的请求
*/
function fetch ({
url='',
data={},
success=()=>{},
error=()=>{},
complete=()=>{}
}) {
let target = document.getElementsByTagName('script')[0] || document.head;
let fecthCallBack = 'fetchCallBack' + ('' + Date.now()).substr(-8) + '_' + ('' + Math.random()).substr(-8);
let timeout = 6000;
let script;
let timer;
let cleanup = () => {
if (script.parentNode) script.parentNode.removeChild(script);
window[fecthCallBack] = () => {};
delete window[fecthCallBack];
if (timer) clearTimeout(timer);
};
// 将Object类型的数据转换为URL链接需要的参数
let paramObj = (params)=>{
let str = '',
key, item;
for (key in params) {
if (typeof params[key] === 'object') {
item = JSON.stringify(params[key]);
} else {
item = params[key];
}
str += `&${key}=${encodeURIComponent(item)}`;
}
return str.substring(1);
};
url += (~url.indexOf('?') ? '&' : '?') + paramObj(data) + '&callback=' + fecthCallBack;
// create script
script = document.createElement('script');
script.src = url;
target.parentNode.insertBefore(script, target);
return new Promise((resolve, reject) => {
window[fecthCallBack] = function (data) {
cleanup();
success(data);
complete(null, data);
resolve(data);
};
if (timeout) {
timer = setTimeout(() => {
cleanup();
error(new Error('Timeout'), url);
reject(new Error('Timeout'));
}, timeout);
}
});
}
export default (argv, params)=>{
let url = '',
data = {a:'1'},
success = function(){},
error = function(){},
complete = function(){};
if( typeof argv==='object' && argv.url ){
url = argv.url;
}else if( typeof argv==='string' ){
url = argv;
if(typeof params==='object'){
argv = params;
}
}
if(!url){
return Promise.reject(new TypeError('url must be needed'));
}
if( typeof argv==='object' ){
if( typeof argv['data']==='object' ){
data = argv['data'];
}
if( typeof argv['success']==='function' ){
success = argv['success'];
}
if( typeof argv['error']==='function' ){
error = argv['error'];
}
if( typeof argv['complete']==='function' ){
complete = argv['complete'];
}
}
if( os.qqnews ){
return newsPost({url, data, success, error, complete});
}else{
return fetch({url, data, success, error, complete});
}
};