2012-09-25 35 views
0

我有一個函數,我正在調用一個MVC控制器,返回一個JSON blob和一些後端操作的內容。這個JSON blob被用來填充呈現給最終用戶的表格。從jQuery.getJSON返回一個JSON blob

我目前的功能看起來是這樣的:

function getJsonFromController(path) { 
    var blob = null; 

    $.getJSON(path, function (data) { 
     blob = data; 
     console.log('inside getjson : ' + blob); 
    }); 

    console.log('outside getjson : ' + blob); 
    return blob; 
} 

...以及呼叫動作,看起來像這樣:

$('#action-button').click(new function() { 
    blob = getJsonFromController('A/B?pageId=1'); 

    console.log('in click event: ' + blob); 
    $.tmpl($template, blob).appendTo($('#table-body')); 
}); 

當我運行網頁/動作調用此,我得到下面的結果,在給定的順序:

outside getjson: null 
in click event: null 
inside getjson: [object Object] 

我已經嘗試了一些其他配置( .complete .getJSON()直接從$ .getJSON()返回一個值,試圖將回調中的'data'回顯到封閉範圍的blob變量,但到目前爲止,blob只顯示其值getJSON回調。這就是說,我也知道JavaScript是一個詞彙範圍的語言,所以它可能是所有正在執行的匿名函數鏈的問題。

問題:我可以看到我的blob在$ .getJSON中正確顯示。現在,我如何讓我的blob出來?

+4

這是一個* *異步機制**。 '$ .getJSON()'回調在'$ .getJSON()'本身返回後發生。 – Pointy

+1

......至於如何做到這一點,那麼您不要將代碼帶到代碼中 - 您需要將代碼帶入代碼塊。在回調中處理它*。 – Pointy

回答

1

AJAX請求是異步的。你可以做同步的(請注意,它將會凍結您的網頁,直到請求完成),而是想更好地會做一些象下面這樣:

function getJsonFromController(path) { 
    var blob = null; 

    $.getJSON(path, function (data) { 
     blob = data; 
     console.log('inside getjson : ' + blob); 
     $.tmpl($template, blob).appendTo($('#table-body')); 
    }); 
} 

並點擊:

$('#action-button').click(new function() { 
    blob = getJsonFromController('A/B?pageId=1'); 
}); 
+0

從「getJsonFromController()」函數返回「blob」沒有意義;它將始終是'null'。 – Pointy

+0

@Pointy - 我知道。只是沒有清除複製/粘貼的代碼。編輯它 –

+0

接受你的答案,它的工作!但仍有一個問題:如何同步執行.getJSON? –