在从函数返回之前等待AJAX​​完成?

时间:2014-08-27 06:25:25

标签: javascript jquery ajax

我有以下

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()函数移动到我的其他函数,我会复制一堆代码。

我该如何避免这种情况?只需将计算包装到它自己的函数中并在必要时调用它?

4 个答案:

答案 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将发送/接收或等待数据。这是非常不可靠和令人沮丧的。