小程序中自定义js文件的this指向问题
// let conf = require('../conf/conf.js');
let conf = require('../config/config');
let principal = conf.CLIENT_TOKEN;
let loading = false
let http = {
globalData: {
SERVER_ERROR: '连接出现异常',
SEVER_EXCEPTION: '服务器异常',
INTERNET_ERROR: '网络似乎不太顺畅',
NOID: '登陆失败,请重新登录',
staticAccess: conf.MSA_ROOT + '/file/get?guid=', //拍摄照片路径
},
request: async function (setting) {
if (!loading) {
wx.showLoading({
title: '加载中',
})
loading = true
}
let that = this;
// console.log(http)
console.log(this)
console.log(that)
//封装请求
var defaultSetting = {};
return new Promise((resolve, reject) => {
console.log('this',this)
if (!setting.success) {
setting.success = function (res) {
resolve(res.data)
if (loading) {
wx.hideLoading()
loading = false
}
if (!res.data.success) {
wx.showToast({
title: res.data.msg,
icon: 'none'
})
}
}
}
defaultSetting = that.updateSetting(setting, defaultSetting);
defaultSetting.header = that.getHeader(defaultSetting.method);
const app = getApp();
// let token = app.context.userInfo.accessToken;
let token = wx.getStorageSync('userInfo') && wx.getStorageSync('userInfo').accessToken;
defaultSetting.url = conf.CERT_ROOT + defaultSetting.url.concat(defaultSetting.url.indexOf('?') >= 0 ? '&' : '?').concat(`accessToken=${token}`);
const storage = app.system.storage;
Object.assign(defaultSetting.header, setting.header);
if (setting.success) {
// if (true) {
// console.log('success', setting)
defaultSetting.success = function (res) {
// console.log('......请求参数配置......');
// console.log(defaultSetting);
// console.log('......请求响应结果......');
that.data = res.data
let code = res.data.code;
if (code == 400002 || code == 400001) {
wx.showModal({
showCancel: false,
content: res.entity || '登录过期,请重新登录',
success: function () {
storage.rm("userInfo");
wx.clearStorageSync();
wx.reLaunch({
url: '/pages/login/login'
})
}
});
return false;
}
try {
setting.success(res);
} catch (e) {
throw e;
}
}
}
wx.request(defaultSetting)
})
},
uploadFile: function (setting) {
let that = this;
//封装请求
var defaultSetting = {};
defaultSetting = that.updateSetting(setting, defaultSetting);
if (setting.success) {
defaultSetting.success = function (res) {
var statusCode = res.statusCode;
console.log('......上传响应结果......');
console.log(res);
that.statusCodeManage(statusCode);
try {
setting.success(res);
} catch (e) {
throw e;
}
}
}
defaultSetting.header = that.getHeader(defaultSetting.method);
console.log('......上传参数配置......');
console.log(defaultSetting);
return wx.uploadFile(defaultSetting);
},
statusCodeManage: function (code) {
//管理http状态码
switch (code.toString()) {
case '500':
wx.showToast({
title: this.globalData.SERVER_ERROR,
icon: 'none',
image: '',
duration: 2000,
mask: true
})
break;
case '502':
case '503':
case '504':
this.showModal({
content: this.globalData.INTERNET_ERROR
});
break;
default:
break;
}
},
updateSetting: function (setting, defaultSetting) {
for (var key in setting) {
defaultSetting[key] = setting[key];
}
return defaultSetting;
},
showModal: function (options) {
options.confirmColor = '#294fdf';
wx.showModal(options);
},
getHeader: function (method) {
let that = this;
let requestId = that.getRequestId();
let timestamp = new Date().getTime();
method = method.toLowerCase();
if (method === 'get') {
return {
'REQUEST_ID': requestId,
'principal': principal,
'cache-control': 'no-cache',
'content-type': 'application/json',
'timestamp': timestamp
}
} else if (method === 'post') {
return {
'REQUEST_ID': requestId,
'principal': principal,
'content-type': 'application/x-www-form-urlencoded',
'timestamp': timestamp
}
}
return {};
},
getRequestId: function () {
let id = [];
for (var i = 0; i < 20; i++) {
id.push((((new Date().getTime() * Math.random()) * 0x10000) | 0).toString(16));
}
return id.join('').slice(1, 65);
}
}
// module.exports = http.request;
let myRequest = http.request
export {myRequest}
按照js的规则 此时的this指向应该是当前的http变量
而有时候指向的是underfind 有时候确实 WIndow?