Javascript 在运行代码之前,请等待jQuery$.get函数完成
在下面的示例中,在调用Javascript 在运行代码之前,请等待jQuery$.get函数完成,javascript,jquery,ajax,Javascript,Jquery,Ajax,在下面的示例中,在调用$.get()完成之前执行return语句。我怎样才能改变这个 var aft={}; aft.getToken=函数(url){ 变数; //获取令牌值 $.get(url、函数(数据){ theToken=$(data.find('input[name=uu RequestVerificationToken')).val(); },“html”); 返回原声; }; jQuery支持这种开箱即用的方法,将选项async设置为false,函数调用将是同步的,而不是异步的
$.get()
完成之前执行return
语句。我怎样才能改变这个
var aft={};
aft.getToken=函数(url){
变数;
//获取令牌值
$.get(url、函数(数据){
theToken=$(data.find('input[name=uu RequestVerificationToken')).val();
},“html”);
返回原声;
};
jQuery支持这种开箱即用的方法,将选项async
设置为false
,函数调用将是同步的,而不是异步的
尽管我建议您保持请求异步,但请参阅本文末尾的“推荐解决方案”
但是我使用的是
$.get
,这似乎是针对$.ajax
?
是的,但是在引擎盖下它们是完全一样的
jQuery.get():
这是一个速记Ajax函数,相当于:
$.ajax({
url: url,
data: data,
success: success,
dataType: dataType
});
示例实现
推荐解决方案
正如前面提到的jQuery文档中的注释所述,异步请求通常不被推荐,而且往往弊大于利
相反,您应该尝试使用回调或类似方法来实现所要求的功能
回调是传递给其他函数以处理特定事件的函数,例如数据检索成功。正如您将回调传递给$。在您自己的代码片段中获取
使函数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);
你不能,至少不理智。虽然有一个async
属性可以在jqueryajax请求上设置,但我在过去尝试将它与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);
});
@Adam Rackis的回调代码对我有用。事实上,如果url的内容是json结构,您可以直接引用如下字段。请注意,aft={yourToken:'}只是一个伪值,因为我根本没有使用这个字典中的值。我只想从URL获取用户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);
这应该是一个最后的解决方案,只有在回调函数或代码重组绝对不起作用的情况下才能实现。不要使用同步请求。取而代之的是学习如何使用事件模型编程,浏览器中的JavaScript基本上都是基于该模型的。@MattiVirkkunen也许不必评论每个人关于OP不应该做什么的答案,您可以提供一个有用的答案来解决OP的问题,并且符合您的标准。@ThinkingStiff:Adam Rackis已经这样做了,我不想再发布同样的内容了。@MattiVirkkunen我们的帖子在风格和可读性上都有很大的不同,我的帖子也更加详细,有指向信息来源的链接(即使我把它从脑后拿出来)。欢迎来到奇妙的异步世界!你不能这样做。这是迄今为止最接近正确的答案,但我不认为使用对象和apply
来传递值有什么意义。仅仅做回调($(数据)…)
?@MattiVirkkunen-这也行。可能更简单。如果回调还关心其他任何事情,使用apply可以让回调访问对象的其余部分about@MattiVirkkunen我能问一下为什么你觉得我的答案不那么准确吗?@refp:因为阻止呼叫(比如同步请求)不属于浏览器中基于事件的JavaScript世界。提出这样的请求的整个选项都是错误的,我希望将来它会被弃用。@refp:var x=1;
没有什么问题。但是,同步请求有很多问题。承认失败,继续前进。
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);