我有以下
function doAjax()
{
var result = false;
$.ajax(url, data)
.done(function(){
// Do a bunch
// of computation
// blah blah blah
result = true;
}).fail(function(){
result = false;
});
return result;
}
function doSomething()
{
if ( doAjax() == true )
console.log('success');
else
console.log('failed');
}
function doSomethingElse()
{
if ( doAjax() == true )
console.log('success');
else
console.log('failed');
}
我有一个运行一些ajax的函数,然后返回true或false,具体取决于ajax是否成功。这是我在代码中从多个地方调用的ajax函数。
因为函数在ajax结束之前结束,所以它总是返回false。我该如何避免这种情况?
我已阅读一些建议我在我的函数中执行return $.ajax()
然后将.done()
和.fail()
函数移至我的doSomething()
和doSomethingElse()
函数的内容。但是,在我的.done()
方法中,我做了一个BUNCH计算。很多代码。所以问题是,如果我将.done()
函数移动到我的其他函数,我会复制一堆代码。
我该如何避免这种情况?只需将计算包装到它自己的函数中并在必要时调用它?
答案 0 :(得分:9)
重构代码以使用回调而不是返回,就像这样......
function doAjax(callback)
{
$.ajax(url, data)
.done(function(){
// Do a bunch
// of computation
// blah blah blah
callback(true);
}).fail(function(){
callback(false);
});
}
function doSomething()
{
doAjax(function(result){
if (result == true )
console.log('success');
else
console.log('failed');
});
}
function doSomethingElse()
{
doAjax(function(result){
if (result == true )
console.log('success');
else
console.log('failed');
});
}
答案 1 :(得分:3)
Techincally你可以像这样ajax synchronous
:
$.ajax({url:myUrl, data:myData, async: false})
但这并不是建议(仅限于非常具体的事情)
否则,只需使用callbacks
,如下例所示:
var menuId = $( "ul.nav" ).first().attr( "id" );
var request = $.ajax({
url: "script.php",
type: "POST",
data: { id : menuId },
dataType: "html"
});
request.done(function( msg ) {
$( "#log" ).html( msg );
});
request.fail(function( jqXHR, textStatus ) {
alert( "Request failed: " + textStatus );
});
了解更多here。
答案 2 :(得分:1)
永远不要与Ajax一起return
,它永远不会奏效。使用Ajax success
函数:
$.ajax({
url: 'http://localhost',
success: function(data){
var doStuff = true;
var responseFromServer = data;
callSomeFooFunction();
//return will not work!
}
})
答案 3 :(得分:1)
当您的Ajax处于异步模式(async: false
)时,它将无法工作。尝试以这种方式构建代码:
function doABuncnchOfComputation(args){ // no duplicates here
// Do a bunch
// of computation
// blah blah blah
}
// doSomething:
$.ajax(url, data)
.done(function(){
doABuncnchOfComputation(...); // call with proper arguments, possibly received from server
console.log('doSomething succeeded');
}).fail(function(){
console.log('doSomething failed');
});
// doSomethingElse:
$.ajax(url, data)
.done(function(){
doABuncnchOfComputation(...); // call with proper arguments, possibly received from server
console.log('doSomethingElse succeeded');
}).fail(function(){
console.log('doSomethingElse failed');
});
因此,您的主计算块doABuncnchOfComputation()
将保持不变并且可以访问每个异步操作。
将Ajax模式设置为同步将使浏览器不执行任何操作,同时网络传输处于活动状态。由于可能的网络不稳定,可能会导致“不良”。用户体验 - 浏览器可能会挂起,页面将处于非活动状态且无响应,而Ajax将发送/接收或等待数据。这是非常不可靠和令人沮丧的。