在下文中,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;
};
答案 0 :(得分:4)
jQuery支持开箱即用,将选项async
设置为false
,函数调用将是同步的,而不是异步的。
虽然我建议您保持请求不同步,但请参阅本文末尾的“推荐的解决方案”。
async (布尔值)默认值:true
默认情况下,所有请求都是异步发送的(即设置为 默认为true)。如果需要同步请求,请将此选项设置为 假。跨域请求和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文档的评论所述,通常不建议使用异步请求,并且通常弊大于利。
相反,您应该尝试使用回调或类似方法来实现所要求的功能。
回调是传递给某个其他函数以处理某个事件的函数,例如数据检索的成功。正如您在自己的代码段中将回调传递给$.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);
答案 1 :(得分:4)
你不能 - 至少不明智。虽然有一个async
属性可以设置jQuery ajax请求,但我有严重问题尝试在过去使用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);
});
答案 2 :(得分:0)
@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);