2011-04-14 36 views
1

我想創建一個可以包含在一個包含的javascript中並且很容易引用的幫助器方法。輔助方法從包裝的jQuery的.getJSON函數...使用jquery/json/getJSON創建一個幫助器方法

function doSomething(someThing) { 
    $.getJSON(theCoolestURLEver, {auth_key:"barfoo", id:someThing}, function(data) { 
    console.log(data); 
    return data; 
    }); 
} 

在我正常的HTML網頁,我想要做的是:

<html> 
<head> 
    <script src="/_/js/myCoolFunctions.js"></script> 
</head> 
<body> 
<script> 
    var someThing = "foobar"; 
    var data = doSomething(someThing); 
    console.log(data); 
</script> 
</body> 
</html> 

最終的結果是,來的console.log回到第二塊代碼中未定義的位置。我現在瞭解到,這與範圍有關,或者在加載<腳本>標記時頁面加載並且數據不可用。所以......如果這是真的,我該如何創建一個可以隱藏一直髮生的複雜性的輔助方法?像添加AUTH_KEY ...

+0

[jQuery的:返回Ajax調用成功後數據]的可能重複(HTTP://stackoverflow.c om/questions/5316697/jquery-return-data-after-ajax-call-success)和[so much more](http://stackoverflow.com/search?q=return+data+from+ajax+call) – 2011-04-14 07:37:19

回答

4

的問題是,AJAX請求(如$.getJSON)是異步。這意味着函數調用會在請求完成之前立即返回。你提供了一個回調函數 - 這個函數在數據收到後運行;這將是之後console.log

(作爲額外的一點,return只設置處理程序,而不是doSomething函數的返回值。)

一輪這一點,最好的辦法是,我認爲,要創建自己的helper方法:

$.getJSONAuth = function(url, data, success) { 
    var authData = {auth_key:"barfoo"}; 

    if ($.type(data) === 'function') { 
     success = data; 
     data = authData; 
    } else { 
     data = $.extend({}, authData, data); 
    } 

    return $.ajax({ 
     url: url, 
     type: 'GET', 
     dataType: 'json', 
     success: success, 
     data: data 
    }); 
} 

您現在可以稱之爲像這樣:

$.getJSONAuth(theCoolestURLEver, {id:someThing}, function(data) { 
    console.log(data); 
}); 
+0

絕對完美。感謝您花時間回答。 – sdolgy 2011-04-14 16:06:42

-1

如果你這樣做:

$.getJSON(theCoolestURLEver, {'auth_key:"barfoo"', 'id:someThing'}, function(data) 

注意「符號四捨五入JSON鍵。我不知道,但我是這麼做的。

+0

這個問題是不是與json鍵被傳遞給getJSON ... – sdolgy 2011-04-14 07:22:49

+0

這是無效的JavaScript ...你有一個誤解:(a)這不是JSON,它是一個JS對象,對於他們來說,鍵不必在引號中(只有當它們不是有效的標識符或數字或其他的東西時)。 (b)如果有的話,JSON中的鍵必須用雙引號。 – 2011-04-14 07:38:47

1

你的doSomething函數不會返回任何東西,getJSON的回調函數會做。 getJSON被執行異步,所以doSomething函數在請求完成之前結束。你可以通過一個函數但是您DoSomething的功能:

function doSomething(someThing, callback) { 
    $.getJSON(theCoolestURLEver, {auth_key:"barfoo", id:someThing}, function(data) { 
    callback(data) 
    return data; 
    }); 
} 

,並調用它是這樣的:

<script> 
    var someThing = "foobar"; 
    doSomething(someThing, function(data) { console.log(data); }); 
</script>