在运行代码之前等待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);
- setInterval和Ajax
- 在不使用数据库的情况下以JSON格式从服务器获取响应?
- 在AJAX调用MVC期间,DDL无法更改
- 以编程方式查看客户端浏览器是否支持PUT / DELETE方法
- Ajax – Access-Control-Allow-Origin不允许使用Origin localhost
- 如何破坏数据表的第一次初始化(模态内的DataTable)
- 如何通过jQuery Ajax调用传递表单数据和我自己的变量?
- jQuery插件:调用回调方法,然后可以根据响应调用插件函数
- 如果我想让我的网站跨平台兼容和屏幕阅读器兼容,我应该避免使用javascript,jquery,flash,ajax,silverlight吗?