Javascript 在AJAX调用未完成时停止JS函数执行
我已经编写了一个小函数来动态地包含CSS文件或JS文件。 我使用jquery函数Javascript 在AJAX调用未完成时停止JS函数执行,javascript,jquery,Javascript,Jquery,我已经编写了一个小函数来动态地包含CSS文件或JS文件。 我使用jquery函数$.getScript()加载JS文件 我想在AJAX调用完成之前阻止函数返回 我尝试过类似的方法,但不起作用: CAPTIVEA.resources._includeResource = function(resource) { var ret = false; if (CAPTIVEA.resources.isIncluded(resource)) { // Resource alr
$.getScript()
加载JS文件
我想在AJAX调用完成之前阻止函数返回
我尝试过类似的方法,但不起作用:
CAPTIVEA.resources._includeResource = function(resource) {
var ret = false;
if (CAPTIVEA.resources.isIncluded(resource))
{ // Resource already included => do nothing
console.log('CAPTIVEA.resources : "' + resource + '" is already included.');
ret = true;
}
else
{ // Resource not included => try to include it
var resType = CAPTIVEA.resources.getType(resource);
switch (resType)
{ // Check resource type to know how to include it
case 'js':
$.when(
$.getScript(resource, function(data, textStatus){
console.info('CAPTIVEA.resources : "' + resource + '" dynamically loaded.'); //success
})
).done(function(){
ret = true;
});
break;
case 'css':
// Load CSS file ...
break;
default:
console.error('CAPTIVEA.resources : "' + resource + '" is not an includable resource.');
break;
}
}
return ret;
}
您可以使用$.ajax并将async设置为false,以便它在继续之前等待响应:
$.ajax({
url: resource,
success: function(data, textStatus) {
console.info('CAPTIVEA.resources : "' + resource + '" dynamically loaded.'); //success
},
dataType: 'script',
async: false
});
试试这个:
CAPTIVEA.resources._includeResource = function(resource) {
var ret = false;
if (CAPTIVEA.resources.isIncluded(resource))
{ // Resource already included => do nothing
console.log('CAPTIVEA.resources : "' + resource + '" is already included.');
ret = true;
}
else
{ // Resource not included => try to include it
var resType = CAPTIVEA.resources.getType(resource);
successFlag = false;
switch (resType)
{ // Check resource type to know how to include it
case 'js':
jQuery.ajax({
async:false,
type:'POST',
url: resource,
data: null,
success: function(){successFlag =true;}
});
break;
case 'css':
// Load CSS file ...
break;
default:
console.error('CAPTIVEA.resources : "' + resource + '" is not an includable resource.');
break;
}
ret = successFlag;
}
return ret;
}
我认为这是唯一的解决方案,即使我们必须添加一个全局变量(successFlag)。另一种解决方案是在成功回调时执行您必须执行的操作,但这样您的函数就不会像您期望的那样工作。使用时通常不需要同步调用。AJAX的全部要点在于它是异步的。第一个A代表异步 为什么需要阻止函数返回?通常,这是因为您希望在加载资源时使用资源(在本例中是脚本)。您必须改用回调: 错:
$.getScript(resource);
doSomethingWithResource();
对:
$.getScript(resource, function() {
doSomethingWithResource();
});
谢谢,我不知道这个选项。但是这是你永远不应该做的事情。如果阻止页面(可能还有浏览器)进行用户输入,将导致糟糕的用户体验。