2012-04-22 48 views
1

我是新來的ajax和jquery,所以請原諒初學者的問題。我對使用AJAX調用和返回JSON對象的過程感到困惑,並且讓您的程序的其餘部分可以使用這些數據。觸發事件和ajax

如果我有這樣的功能:

function treeData(){ 
    $.getJSON("/recipe/recipelist/", function(data) { 

    // sorts array by title, alphabetically 
    data.sort(function(a, b){ 
     return b.title < a.title ? 1 : b.title > a.title ? -1 : 0; 
    }); 

    return data; 
    }); 
} 

,我嘗試訪問該數據像這樣,

var obj = treeData(); 

我得到一個錯誤說obj是不確定的。基本上,我不明白爲什麼這不起作用。我假設它與我的退貨聲明有關。我希望能夠構建另一個「刪除」函數,該函數在被調用時觸發.getJSON請求並重繪我的數據庫條目列表。

在此先感謝。

回答

2

你不能那樣做。 return語句從內部函數返回,而不是treeData函數。可以使用Deferred來做到這一點。

function treeData() { 
    return $.ajax({ 
     url: "/recipe/recipelist/", 
     type: "get", 
     dataType: "json" 
    }); 
} 

$.when(treeData()).then(function(data) { 
    data.sort(function(a, b) { 
     return b.title < a.title ? 1 : b.title > a.title ? -1 : 0; 
    }); 
    var obj = data; 
    // you can use obj safely 
}); 
+0

我不知道延期甚至存在。謝謝。你會建議使用這種方法通過其他答案中提供的標準回調方法嗎? – bento 2012-04-22 22:26:10

+0

那麼在你的情況下,我認爲兩者都是等價的,但分開關注(*獲得*數據和*工作與*數據)是一個很好的想法。另外,Deferred功能非常強大,回調有些「有限」。你可以看看這個瞭解更多http://danheberden.com/presentations/deferreds-putting-laziness-to-work/ :) – pomeh 2012-04-22 22:42:06

+0

@bento你也可以檢查那些鏈接http://www.erichynds.com/jquery /使用deferreds-in-jquery /和http://www.bennadel.com/blog/2212-Using-jQuery-s-Deferred-Functionality-For-Asynchronous-Configuration.htm – pomeh 2012-04-22 22:52:31

2

你必須把它的回調,這樣就可以做一些與Ajax中的A代表異步的,這意味着該代碼不等待響應的treeData

//modified tree data 
function treeData(callback){ 
    $.getJSON("/recipe/recipelist/", function(data) { 
     data.sort(function(a, b){ 
      return b.title < a.title ? 1 : b.title > a.title ? -1 : 0; 
     }); 
     callback(data); //supply the callback with the data 
    }); 
} 

var obj; 

treeData(function(newdata){ //the supplied data 
    obj = newdata   //assign to obj 
}); 
+0

這樣做總的意義。謝謝約瑟夫。 – bento 2012-04-22 22:09:19

2

返回的數據到達,但是一個回調函數在它被調用時被調用。如果您嘗試立即返回該值,它將不會被設置。

使用您的功能太回調:

function treeData(callback){ 
    $.getJSON("/recipe/recipelist/", function(data) { 

    // sorts array by title, alphabetically 
    data.sort(function(a, b){ 
     return b.title < a.title ? 1 : b.title > a.title ? -1 : 0; 
    }); : 


    callback(data); 
    }); 
} 

用法:

treeData(function(obj){ 
    // here you can use the result 
}); 
0

你不能return從回調。相反,你應該指定data做一個在treeData之外聲明的變量,或者只是在回調中做data

0

默認情況下,AJAX請求是異步的,到您的函數返回時,AJAX請求尚未完成且數據不可用。您必須開始使用您傳遞給$.getJSON的回調函數中的數據。這樣,你的代碼就可以訪問數據。約瑟夫提供了一個這樣的例子。

0

$ .getJSON是一個異步請求,這意味着代碼被執行但不會等待它完成。該代碼將不起作用的原因有兩個:

  1. 您可能在getJSON甚至完成執行之前指定treeData()的值。

  2. 在您的示例中,treeData()實際上不會返回任何值,getJSON回調函數會執行此操作。

這會工作:

var obj; 

function treeData(){ 
    $.getJSON("/recipe/recipelist/", function(data) { 

    // sorts array by title, alphabetically 
    data.sort(function(a, b){ 
     return b.title < a.title ? 1 : b.title > a.title ? -1 : 0; 
    }); 

    obj = data; 
    }); 
}; 

treeData(); 

但是,你不知道什麼時候的getJSON回調過完射擊,所以你可能要與回調本身的排序結果的工作。