在从函数返回之前等待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()函数移动到我的其他函数,我复制了一堆代码。

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

重构你的代码以使用回调而不是返回,像这样……

 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'); }); } 

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 ); }); 

在这里阅读更多。

永远不要与Ajax一起return ,它永远不会工作。 使用Ajax success函数:

 $.ajax({ url: 'http://localhost', success: function(data){ var doStuff = true; var responseFromServer = data; callSomeFooFunction(); //return will not work! } }) 

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