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
,函数调用将是同步的,而不是异步的

尽管我建议您保持请求异步,但请参阅本文末尾的“推荐解决方案”

异步(布尔)默认值:true

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

请注意,同步请求可能会 暂时锁定浏览器,禁用请求时的任何操作 它是活动的


但是我使用的是
$.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);