2012-11-26 44 views
1

可變範圍我有一個類似的代碼是:jQuery方法,在JavaScript

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; 
} 

所以,code'll返回false值。我怎樣才能不使用HTML文檔的DOM分配一個值的變量,如分配一個值到一個標籤的HTML屬性,然後通過jQuery獲取?

如何在JavaScript中使用任何'全局'變量?

+0

不能從異步函數返回。將任何依賴'variable_to_return'的代碼移入成功回調。 –

+0

'$ .ajax'是異步的。請自行研究 – zerkms

回答

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 
}); 
0

你不能做到這一點,而這樣做的異步調用調用它。您可以強制同步調用,但這會導致服務器返回響應之前凍結您的頁面。添加異步: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; 
} 

但我仍然會建議重構您的代碼並僅在回調中使用變量。

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] 
);