You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:19:58