最近遇到个问题就是,前台定时刷新,调用一个后台方法后总是获取到false,也就是默认值,明明返回的是true,其实是异步调用的问题。其实如果在调用 PanduanBwSteps
方法时总是得到 false
,即使在方法内部它返回了 true
,那么有几个可能的原因也需要考虑:
-
参数值不匹配: 在调用
PanduanBwSteps
方法时,确保传入的tempName
值与switch
语句中的case
情况匹配。比如说,确认tempName
是否是 "1#滤池"、"2#滤池" 或者 "3#滤池"。 -
异步问题: 如果
PanduanBwSteps
方法中涉及到了异步操作,确保异步操作已经完成并返回了正确的值。如果涉及到异步操作,可能需要使用 Promise 或者回调函数来确保在异步操作完成后再返回值。 -
上下文问题: 在
PanduanBwSteps
方法内部,确保this
关键字引用的是正确的对象。你已经使用了_this
变量来保存上下文,在方法内部应该使用_this
来访问对象的属性和方法。
//分配水池用户站参数判断反冲洗步骤 PanduanBwSteps: function (fName) { var _this = this; switch (fName) { case "1#滤池": return _this.GetBWSteps(_this.filterParam1); case "2#滤池": return _this.GetBWSteps(_this.filterParam2); case "3#滤池": return _this.GetBWSteps(_this.filterParam3); default: return false; // 如果没有匹配到任何情况,默认返回 false } }, //获取反冲洗步骤实时数据 GetBWSteps: function (usParams) { var _this = this; axios({ method: 'post', url: '../WebServices/DeviceMonitorService.asmx/GetDeviceRealtimeDataByUserStationParams', data: { loginIdentifer: this.guid, userStationParams: usParams } }).then(function (response) { if (response.Result) { var devRealTimeInfos = response.DevDatas; for (var devRealTimeInfo of devRealTimeInfos) { if (devRealTimeInfo["PLC通讯状态"].Value == "正常") { var stepName = ["气洗", "气水混合洗", "水洗", "初滤", "过滤"]; var steps = {}; for (let i = 0; i < stepName.length; i++) { var name = stepName[i]; if (devRealTimeInfo.hasOwnProperty(name)) { // 检查是否存在对应的步骤名称 if (devRealTimeInfo[name].Value === "启动") { steps[name] = devRealTimeInfo[name].Value; _this.singleStepName = devRealTimeInfo[name]; return true; } } } //console.log(steps); _this.singleStepName = ""; return true; } else { _this.singleStepName = ""; return false; } } } else { return false; } }); },
问题出在 GetBWSteps
函数中。这个函数使用了 Axios 来发送异步请求,但是它自身并没有返回任何值。换句话说,无论是 true
还是 false
都不会直接返回给 PanduanBwSteps
函数。
解决这个问题的方法是使用 Promise 来确保异步操作完成后再返回结果。修改 GetBWSteps
函数,使其返回一个 Promise 对象。当异步操作完成后,根据条件解决或拒绝 Promise,然后在 PanduanBwSteps
函数中处理 Promise 的结果。
这里是修改后的代码
//获取反冲洗步骤实时数据
GetBWSteps: function (usParams) {
var _this = this;
return new Promise(function (resolve, reject) {
axios({
method: 'post',
url: '../WebServices/DeviceMonitorService.asmx/GetDeviceRealtimeDataByUserStationParams',
data: {
loginIdentifer: _this.guid,
userStationParams: usParams
}
}).then(function (response) {
if (response.Result) {
var devRealTimeInfos = response.DevDatas;
for (var devRealTimeInfo of devRealTimeInfos) {
if (devRealTimeInfo["PLC通讯状态"].Value == "正常") {
var stepName = ["气洗", "气水混合洗", "水洗", "初滤", "过滤"];
var steps = {};
for (let i = 0; i < stepName.length; i++) {
var name = stepName[i];
if (devRealTimeInfo.hasOwnProperty(name)) { // 检查是否存在对应的步骤名称
if (devRealTimeInfo[name].Value === "启动") {
//steps[name] = devRealTimeInfo[name].Value;
_this.singleStepName = name;
resolve(true);
return; // 不再继续循环
}
}
}
//console.log(steps);
_this.singleStepName = "";
resolve(true);
} else {
_this.singleStepName = "";
resolve(false);
}
}
} else {
resolve(false);
}
}).catch(function (error) {
reject(error);
});
});
},
现在 GetBWSteps
函数返回一个 Promise 对象。在异步操作完成后,根据条件调用 resolve(true)
或 resolve(false)
来解决 Promise。在调用 PanduanBwSteps
函数时,使用 .then()
方法来处理 Promise 的结果。