2013-03-04 37 views
0

這個問題實際上是由我沒有完全理解jquery引起的。獲取變量出一個get ajax調用

我有一些代碼,我試圖把一個函數使用多次。

function actors(query){ 
    $.get("websit.com?title=" + query + "&type=json", function(html){ 
     var result = html; 
     var obj = eval ("(" + result + ")"); 
     var actor = obj[0].actors; 
     return actor; //as far as im aware this does nothing 
    }); 
    return 0; // gets here and returns zero, returning actor here returns undefined 
} 

演員變量保存我需要的信息,但我掙扎着爬了出來變量的函數。 由於內在的功能,它會穿過並得到return 0;

如果我嘗試將一個變量分配給內部函數它將返回一個對象,而不是返回變量。

任何解決方案或指針在正確的方向將不勝感激。

+2

歡迎** **異步的奇妙世界!你不能那樣做。 – SLaks 2013-03-04 21:12:04

回答

4

每月詢問1000次這個問題。您不能使異步調用像同步調用一樣行事。這就是回調的目的。

您也在使用jQuery,不需要使用eval!設置正確的內容類型,它會爲你解析數據。

有回調

function actors(query, callback){ 
    $.getJSON("websit.com?title=" + query + "&type=json", function(data) { 
     var actor = data[0].actors; 
     callback(actor); 
    }); 
} 


function processResults(info){ 
    console.log(info); 
} 

actors("Something", processResults); 
+0

所以我在流程結果中編寫了腳本執行的延續? 初始腳本將結束,回調將接收結果並執行。 – 2013-03-04 21:44:03

+0

是的,你的邏輯將分兩步走。第一步是收集信息並進行呼叫,第二步[回調]將處理結果。 – epascarello 2013-03-04 21:45:40

+0

有意義,如果要多次運行該函數並比較結果會發生什麼情況? – 2013-03-04 21:46:45

1

雖然這是事實,你不能做到這一點,我發現,這樣的事情是,我已經在運行大多數情況下,可接受的解決方法:

function getMeSomeJSON(query) {  
    return $.get("websit.com?title=" + query + "&type=json"); 
} 

將返回請求對任何調用的響應。

或者,您可以:

  • 傳遞給回調的響應。
  • 使用$ .ajax和async:false,但是,這被認爲是不好的做法。
0

正如你已經注意到自己,你的Ajax響應處理程序執行後演員函數返回,從而使得相當困難的返回值。標準的解決方案是從演員的功能中返回一個承諾。您可以在jquery docs中閱讀承諾或延期對象。

這將是我的建議:

function actors(query){ 
    var actorsPromise = $.Deferred(); 
    $.get("websit.com?title=" + query + "&type=json", function(html){ 
     var result = html; 
     var obj = eval ("(" + result + ")"); 
     var actor = obj[0].actors; 
     actorsPromise.resolve(actor); 
    }); 
    return actorsPromise; 
} 

actors(/* your query */).done(function(actor) { 
    //do whatever you need with your actor 
});