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

如何并行实现带缓存的条件异步AJAX调用?

优化条件AJAX调用与参数缓存的并行逻辑实现

我有一个和Stack Overflow问题《Elegant solution to conditional AJAX call》类似的需求:需要通过API调用加载参数并缓存,供后续AJAX调用使用,同时要求该逻辑与另一个AJAX调用并行执行。

以下是我的伪代码:

var myParameter;
function myUpdate() {
    $.when(
        // 始终执行的AJAX调用
        $.ajax(params1),
        (async () => {
            // 若参数未加载则获取
            if (myParameter == null) {
                let response = await fetch(someParams);
                myParameter = doStuff(response);  // 此处为无关的处理逻辑
            }
            // 若参数为0则返回已完成的Promise,否则执行带参数的AJAX调用
            return myParameter == 0 ? $.when() : $.ajax(Object.assign(params2, {data: { value: myParameter }}));
        })()
    ).then(handleData);  // 最终处理所有响应数据
}

由于$.when对原生Promise和jQuery Deferred的处理存在兼容问题,上述代码无法正常运行,于是我写出了如下臃肿的代码:

var myParameter;
function myUpdate() {
    $.when(
        $.Deferred((dfrd) => {
            $.ajax(params1).then((response) => {dfrd.resolve(response)});
        }).promise(),
        $.Deferred((dfrd) => {
            if (myParameter == null) {
                fetch(someParams).then((response) => {
                    myParameter = doStuff(response);
                    if(myParameter != 0) {
                        $.ajax(Object.assign(params2, {data: { value = myParameter }})).then((response) => {dfrd.resolve(response)});
                    } else {
                        dfrd.resolve();
                    }
                });
            } else {
                if(myParameter != 0) {
                    $.ajax(Object.assign(params2, {data: { value = myParameter }})).then((response) => {dfrd.resolve(response)});
                } else {
                    dfrd.resolve();
                }
            }
        }).promise()
    ).then(handleData);
}

虽然这段代码可以运行,我也可以参考相关回答精简冗余部分,但不确定这是否是正确的实现方式。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:35:00