[英]How to wait for function to finish before running another one or rest of the code?
[英]Wait for jQuery $.get function to finish before running code
在下面, 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;
};
jQuery支持開箱即用,將選項async
設置為false
,函數調用將是同步的,而不是異步的。
雖然我建議您保持請求異步,但請參閱本文末尾的“ 推薦解決方案 ”。
async (Boolean)默認值:true
默認情況下,所有請求都是異步發送的(默認情況下設置為true)。 如果需要同步請求,請將此選項設置為false。 跨域請求和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);
你不能 - 至少不明智。 雖然你可以在jQuery ajax請求上設置async
屬性,但我在過去嘗試使用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);
});
code by @Adam Rackis is working for me. @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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.