jQuery方法,JavaScript中的变量范围

时间:2012-11-26 09:53:59

标签: jquery ajax variables scope

我有这样的代码:

function some_func_validate(some_id) {
    var variable_to_return = false; // i wanna use that
    $.ajax({
        type: 'GET',
        url: '/something/'+some_id+'/check',
        success: function(response){
            variable_to_return = true; // in this place
        }
    });
    return variable_to_return;
}

因此,代码将返回false值。如何在不使用HTML文档的DOM的情况下为变量赋值,例如为某些标记的html属性赋值,然后通过jQuery获取它?

如何在JavaScript中使用任何“全局”变量?

3 个答案:

答案 0 :(得分:1)

由于ajax是异步的,你需要做这样的事情

function some_func_validate(some_id, cb) {

    $.ajax({
        url: '/something/'+some_id+'/check',
        success: function(response){
            cb(response);
        }
    });

}

并使用

调用它
some_func_validate(some_id, function(response){
    //handle response here
});

答案 1 :(得分:0)

执行异步调用时无法执行此操作。您可以强制进行同步调用,但这会导致在服务器返回响应之前冻结您的页面。添加async:flase切换到您的通话。

function some_func_validate(some_id) {
   var variable_to_return = false; // i wanna use that
   $.ajax({
       type: 'GET',
       async: false,
       url: '/something/'+some_id+'/check',
       success: function(response){
           variable_to_return = true; // in this place
       }
   });
   return variable_to_return;
}

但我仍然建议重构代码并仅在回调中使用变量。

答案 2 :(得分:0)

从版本1.5开始,jQuery使用实用程序来处理使用名为Deffered的对象的回调和异步调用的管理。使用这些类型的对象,客户端更容易添加在完成某些后台工作时调用的回调。以下是使用代码的示例:

function some_func_validate(some_id) {
    var deferred = $.Deferred(),
        context = {
           id: some_id,
           success: false
        };

    $.ajax({
        type: 'GET',
        url: '/something/'+some_id+'/check'
    })
    .done(function(response){
       context.success = true;
       context.content = response;
       deferred.resolveWith(context);
    })
    .fail(function() {
       deferred.rejectWith(context)
    });

    return deferred.promise();
}

使用示例:

some_func_validate(5).then (
    function (context) {
      // Handle successful validation.
      console.log(context);
    },
    function (context) {
      // Handle failed validation.
      console.log(context)
    }
);

另一个用法示例:

function logger (context) {
   console.log(context);
}

function onSuccessfulValidation (context) {
   // Handle successful validation.
   // context contains {id, content, success}
}

function onFailedValidation (context) {
   // Handle failed validation.
   // context contains {id, success}
}

some_func_validate(3).then (
    [logger, onSuccessfulValidation],
    [logger, onFailedValidation]
);