ExtJs Promise二次调用复用首次参数问题求助
问题根源与解决办法
核心问题
你在sendGetConfigurationTaskRequest方法里,每次调用都会直接修改Store代理的api.getConfiguration属性——把原本带{jobId}占位符的模板URL替换成了具体的请求URL。第一次调用后,模板已经被覆盖成类似server-jobs-configuration/loglevel/AINAPS的具体地址,后续再调用replaceParameters时,因为URL里已经没有{jobId}占位符,替换操作完全无效,导致GET请求一直复用第一次的参数。
修复方案
方案一:不修改原始模板,每次生成临时请求URL
直接基于原始模板生成当前请求的URL,不改动Store里存储的模板,从根源避免覆盖问题:
sendGetConfigurationTaskRequest: function (JobId) { var me = this, promise = new U4.util.Promise(), // 基于原始模板生成临时请求URL,不修改代理中的模板 requestUrl = U4.data.proxy.UrlTemplate.replaceParameters({ jobId: JobId }, me.proxy.api.getConfiguration); Ext.Ajax.request({ url: requestUrl, method: 'GET', success: function (data) { promise.resolve(data); }, failure: function (data) { promise.reject(data); } }); return promise; },
方案二:保留原始模板副本
如果需要保留修改代理API的逻辑,可在Store初始化时保存原始模板的副本,每次替换都基于副本操作:
Ext.define('U4.fundamentals.backgroundjobs.store.BackgroundJobsMonitoringStore', { autoLoad: true, extend: 'Ext.data.Store', alias: 'store.backgroundjobsmonitoringstore', storeId: 'BackgroundJobsMonitoringStore', model: 'U4.fundamentals.backgroundjobs.model.BackgroundJobsMonitoringModel', proxy: { type: 'rest', api: { read: U4.getApiPath('server-jobs'), run: U4.getApiPath('server-jobs'), kill: U4.getApiPath('server-jobs/{jobId}/{taskId}/kill'), getAllConfiguration: U4.getApiPath('server-jobs-configuration/loglevel'), getConfiguration: U4.getApiPath('server-jobs-configuration/loglevel/{jobId}'), postJobPauseConfiguration: U4.getApiPath('server-jobs-configuration/loglevel') } }, // 初始化时保存原始模板 initComponent: function() { this.callParent(arguments); this.originalGetConfigUrl = this.proxy.api.getConfiguration; }, sendGetConfigurationTaskRequest: function (JobId) { var me = this, promise = new U4.util.Promise(); // 基于原始模板生成新URL,再赋值给代理API me.proxy.api.getConfiguration = U4.data.proxy.UrlTemplate.replaceParameters({ jobId: JobId }, me.originalGetConfigUrl); Ext.Ajax.request({ url: me.proxy.api.getConfiguration, method: 'GET', success: function (data) { promise.resolve(data); }, failure: function (data) { promise.reject(data); } }); return promise; }, // 其余方法保持不变 sendPauseTaskRequest: function (jobId, activeToTimeIncrement) { var me = this; var getStatusPromise = Promise.resolve(me.sendGetConfigurationTaskRequest(jobId)); return getStatusPromise.then(function (response) { var sendStatusPromise = new U4.util.Promise(); var jobSettingDto = response.responseText; var responseText = JSON.parse(jobSettingDto); console.log(responseText); var date = new Date(); date.setHours(date.getHours() + activeToTimeIncrement); return Ext.Ajax.request({ url: me.proxy.api.postJobPauseConfiguration, jsonData: JSON.stringify({ LogLevel: responseText.logLevel, RunsRemaining: responseText.runsRemaining, JobId: jobId, Status: responseText.jobStatus, ActiveToTime: date.toISOString(), KeepTempTables: responseText.keepTempTables }), method: 'POST', success: function (data) { sendStatusPromise.resolve(data); }, failure: function (data) { sendStatusPromise.reject(data); } }); }); } });
额外优化(非必需)
sendPauseTaskRequest里可以简化Promise的使用,不用额外创建sendStatusPromise,直接用Promise包装请求:
sendPauseTaskRequest: function (jobId, activeToTimeIncrement) { var me = this; return me.sendGetConfigurationTaskRequest(jobId).then(function (response) { var responseText = JSON.parse(response.responseText); console.log(responseText); var date = new Date(); date.setHours(date.getHours() + activeToTimeIncrement); return new U4.util.Promise(function(resolve, reject) { Ext.Ajax.request({ url: me.proxy.api.postJobPauseConfiguration, jsonData: { LogLevel: responseText.logLevel, RunsRemaining: responseText.runsRemaining, JobId: jobId, Status: responseText.jobStatus, ActiveToTime: date.toISOString(), KeepTempTables: responseText.keepTempTables }, method: 'POST', success: resolve, failure: reject }); }); }); }
内容的提问来源于stack exchange,提问作者Weedosaurus
相关产品推荐
相关产品推荐

