前台异步调用返回值的问题

        最近遇到个问题就是,前台定时刷新,调用一个后台方法后总是获取到false,也就是默认值,明明返回的是true,其实是异步调用的问题。其实如果在调用 PanduanBwSteps 方法时总是得到 false,即使在方法内部它返回了 true,那么有几个可能的原因也需要考虑:

  1. 参数值不匹配: 在调用 PanduanBwSteps 方法时,确保传入的 tempName 值与 switch 语句中的 case 情况匹配。比如说,确认 tempName 是否是 "1#滤池"、"2#滤池" 或者 "3#滤池"。

  2. 异步问题: 如果 PanduanBwSteps 方法中涉及到了异步操作,确保异步操作已经完成并返回了正确的值。如果涉及到异步操作,可能需要使用 Promise 或者回调函数来确保在异步操作完成后再返回值。

  3. 上下文问题: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 的结果。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值