优雅的条件AJAX调用解决方案

时间:2015-02-27 11:31:08

标签: javascript jquery ajax

我正在编写一些包含AJAX系列调用的javascript,我正在寻找以下问题的优雅解决方案:该脚本的目标是收集参数,然后使用这些参数执行API调用。第一次执行调用时,需要从服务器请求一个参数 - 每个后续调用都将使用此参数的存储值。这是问题的开始。我希望只有这是第一次才能进行条件化AJAX调用。我不想将其余的代码放入AJAX调用的成功函数中,因为这似乎令人费解。我想要像下面这样的东西,但由于调用的明显异步性质,我意识到这是不可能的。我还想避免进行同步调用,因为这会导致线程阻塞:

var myParameter;

if(!params.myParam.isStored) {
    myParameter = getParamWithAjaxCall();
} else {
    myParameter = params.myParam;
}

// Continue with the rest of execution here of which there is a lot of code

很抱歉,如果这似乎是一个显而易见的问题,我已经使用以下方法研究了解决方案,但我正在寻找有关最优雅解决方案的经验丰富的意见:

jQuery:when.done

jQuery:async:false

将回调传递给Ajax调用

2 个答案:

答案 0 :(得分:3)

我会创建一个包装函数,您将逻辑传递给done()中的回调函数。像这样:

function makeRequest(callback) {
    if (!params.myParam) {
        // retrieve param
        $.ajax({
            url: '/getParam',
            success: function(data) {
                params.myParam = data.param;
            } 
        }).done(callback);  
    }
    else {
        // param already has a value...
        callback();
    }
}

makeRequest(function() {
    // make your AJAX request here, knowing that params.myParam will have a value.
});

答案 1 :(得分:1)

您可以使用类似的承诺(我在这里使用过JQuery承诺):

function ParameterValueProvider() {

    var parameterValue;

    return function() {

        var deferred = $.Deferred();

        if ( parameterValue === undefined ) {
            $.ajax({
                // ... ajax parameters go here
            }).done(function(rsp) {
                parameterValue = rsp;
                deferred.resolve(parameterValue);
            });
        }

        deferred.resolve(parameterValue);

        return deferred;

    }

}

// Your Application
(function() {

    'use strict';

    var getParam = ParameterValueProvider();

    // this will get the value from server the firs time
    // and subsequent calls will use the cached value
    getParam().then(function() {
        // subsequent ajax calls go here
    });

}());