我正在编写一些包含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调用
答案 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
});
}());