在从函数返回之前等待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将发送/接收或等待数据。 这是非常不可靠和令人沮丧的。