2012-05-30 78 views
0

我有一個使用getJSON但它不工作像我期望的功能。爲什麼返回不能在getJSON中工作,爲什麼不能在getJSON中寫入變量?

function balbla(name, param) { 
     $.getJSON("/blabla.json?name=" + name + "&param=" + param, function(data) { 
       return data.bla; 
     }); 
} 

當我使用alert(data.bla)中的getJSON方法它的工作原理,但是當我嘗試return data.bla它does not。另外,當我創建一個變量,並嘗試寫入它的值data.bla它簡直不工作!

//我嘗試這樣做:

function getRouteData(name, param) { 
    return $.getJSON('/routes_js.json', {route:name, opt: param}); 
} 
function getRoute(name, param) { 
     getRouteData(name, param).done(function(data) { 
       return data.route; 
     }); 
} 

但是當我打電話getRoute("bla", "blub")它仍然返回undefined

+0

http://stackoverflow.com/questions/10341365/php-json-encode-to-js/10341552#10341552 – RGB

+0

[jQuery getJSON可能重複 - 返回調用者函數的值](http:// stackoverflow。 com/questions/1229307/jquery-getjson-return-value-to-the-caller-function) –

回答

5

AJAX是異步的。您不能輕易返回一個取決於AJAX調用結果的函數中的值。改變你的函數接受回調:

function balbla(name, param, cb) { 
    $.getJSON('/blabla.json', {name:name, param: param}, function(data) { 
     cb(data.bla); 
    }); 
} 

而且使用這樣的:

balbla('foo', 'bar', function(bla) { 
    // do stuff 
}); 

一個更清潔的方式將返回jqXHR對象:

function balbla(name, param) { 
    return $.getJSON('/blabla.json', {name:name, param: param}); 
} 

當調用它,使用遞延/承諾的jqXHR對象的接口,用於將成功回調:

在同步模式下使用
balbla('foo', 'bar').done(function(data) { 
    alert(data.bla); 
}); 

注意是不是你應該考慮在所有的選項。它可能會掛起瀏覽器的用戶界面(或至少活動選項卡),直到請求完成。除此之外,異步回調是每個人都這樣做的方式。

如果你不喜歡使用回調函數,你可以使用一個預處理器,如tamejs自動生成異步函數。

+1

你可以通過返回'$來簡化它。getJSON'並讓調用代碼使用承諾來附加回調。您也可以免費獲得錯誤回調。 – Esailija

+0

我喜歡這個想法。去編輯答案。 – ThiefMaster

+0

感謝您的回答。我嘗試了更清潔的方式,但它仍然不適合我! – davidb

2

getJSON是異步的,不同步的。您需要使用回調,因此您的邏輯需要分兩步完成。調用步驟和處理步驟。

+0

即使它是同步的,他的代碼也不會工作,因爲'return'語句不在blabla函數中 – Esailija

3

與return語句的功能:

function(data) { 
    return data.bla; 
} 

...是不是被你的代碼調用(它被深深稱爲內部jQuery的),所以你沒有辦法把左手側的分配的函數調用。

它也被稱爲異步函數的一部分,所以balbla函數將在完成運行並返回之前返回匿名函數。

如果您想對響應數據做些什麼,請在的內部使用匿名回調函數

相關問題