UNPKG

tencent-qqnews-user

Version:

用于在腾讯新闻客户端中进行登录、获取用户信息和提交请求等操作

159 lines (141 loc) 3.72 kB
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}); } };