在运行代码之前等待jQuery $ .get函数完成

在下面, return语句 $.get()调用完成之前执行。 我怎么能改变这个?

 var aft = {}; aft.getToken = function (url) { var theToken; //Get the token value $.get(url, function (data) { theToken = $(data).find('input[name=__RequestVerificationToken]').val(); }, "html"); return theToken; }; 

你不能 – 至少不明智。 虽然你可以在jQuery ajax请求上设置async属性,但我在过去尝试使用false值时遇到了严重的问题

尝试重新思考你想要完​​成的事情:

 var aft = { yourToken: '' }; aft.setToken = function (url, callback) { $.get(url, function (data) { this.yourToken = $(data).find('input[name=__RequestVerificationToken]').val(); if (callback) callback.apply(this); }, "html"); }; 

然后:

 aft.setToken("url.php", function() { alert("Token retrieved = " + this.yourToken); }); 

或者,如果您的回调需要访问返回的数据,那么您可以更简单地做

 if (callback) callback(data); 

然后

 aft.setToken("url.php", function(dataReturned) { alert("Ajax data retrieved = " + dataReturned); }); 

jQuery支持开箱即用,将选项async设置为false ,函数调用将是同步的,而不是异步的。

虽然我建议您保持请求不同步,但请参阅本文末尾的“ 推荐解决方案 ”。

  • jQuery.ajax() – jQuery API

async (Boolean)默认值:true

默认情况下,所有请求都是异步发送的(默认情况下设置为true)。 如果需要同步请求,请将此选项设置为false。 跨域请求和dataType:“jsonp”请求不支持同步操作。

请注意,同步请求可能会暂时锁定浏览器,在请求处于活动状态时禁用任何操作。


但我使用$.get ,这似乎是特定于$.ajax

是的,但在引擎盖下它们完全是一回事。

jQuery.get()

这是一个简写的Ajax函数,相当于:

 $.ajax({ url: url, data: data, success: success, dataType: dataType }); 

示例实施

 aft.getToken = function (url) { var theToken; $.ajax({ url: url, dataType: 'html' success: function (data) { theToken = $(data).find('input[name=__RequestVerificationToken]').val(); }, dataType: dataType }); return theToken; } 

推荐解决方案

正如前面提到的来自jQuery文档的评论所述,通常不建议使用异步请求,并且通常弊大于利。

相反,您应该尝试使用回调或类似方法来实现所要求的function。

回调是传递给某个其他函数以处理某个事件的函数,例如数据检索的成功。 正如您在自己的代码段中将回调传递给$.get

使你的函数aft.getToken接受一个名为callback的第二个参数,它应该是一个函数引用。 然后在数据检索和“解析”完成时,使用您的ajax请求回复的令牌作为参数调用此函数。

 aft.getToken = function (url, callback) { var dst_object = this; $.get (url, function (data) { dst_object.stored_token = $(data).find ( 'input[name=__RequestVerificationToken]' ).val (); callback (dst_object.stored_token); }, "html"); }; ... aft.getToken ('/path/to/file.html', function (token) { console.log ("Got token: " + token); }); ... console.log (aft.stored_token); 

@Adam Rackis的回调代码对我有用。 实际上,如果url的内容是json结构,你可以直接引用这样的字段。 请注意,aft = {yourToken:”}只是假的,因为我根本没有使用这个字典中的值。 我只是想从URL获取user_id。

 var aft = { yourToken: '' }; aft.setToken = function(url, callback){ $.get(url, function(data) { user_id = data[0]['user_id']; if (callback) callback(data); }); }; aft.setToken("https://XXXXXX.azurewebsites.net/.auth/me", function(dataReturned){ alert("You user id is " + labeler);