2011-12-19 157 views
0

我有一些從API請求一些JSON的代碼。當數據返回時,根據文檔,它發回一個回調函數,該函數將用於解析頂級數據。呼叫作出後,我有以下代碼捕獲數據,並對其進行處理:將Params傳遞給一個窗口[回調]函數

var callback = 'functionUsedInApiCall'; 
window[callback] = newCallBackFunction; 

我怎麼會去通過自訂參數給回調函數上面的數據被返回?

爲了捕獲數據,我必須寫這樣的回調函數:

function newCallBackFunction(root) { 
    //root is the data 
} 

任何幫助將不勝感激。

回答

2

你在說什麼JSONP?如果是這樣,根本不調用回調或傳遞參數,API返回的代碼會。

例如,你的代碼:

window.myCallback = newCallbackFunction; 

function newCallbackFunction(data) { 
    // use the data 
} 

(我假設這是不是在全球範圍內,因此分配給window對象。)

...加上你的啓動代碼JSONP調用,它通常在頁面中添加一個script元素,其中包含回調名稱的URL(上面的「myCallback」)。

他們的反應會是這樣的:

myCallback({ 
    // data here 
}); 

...,當它到達,將運行(因爲它是一個script元素的內容),並調用你的函數。這是JSONP的工作原理。


如果要包括進一步參數的功能,你要做的就是有他們叫轉身打電話給你的目標函數的回調,如:

window.myCallback = function(data) { 
    newCallbackFunction(data, "foo", "bar"); 
}; 

function newCallbackFunction(data) { 
    // use the data 
} 

現在,當他們的代碼調用全球myCallback,它所做的全部事情都是轉身,並用您指定的參數撥打電話newCallbackFunction

這些參數不必像上面那樣是文字。下面是一個有點上下文的示例,使用closure

// Assume the url already contains the name of the callback "myCallback" 
function doJSONP(url, niftyInfo, moreNiftyInfo) { 
    var script; 

    // Set up the callback 
    window.myCallback = function(data) { 
     // Runs when the data arrives 
     newCallbackFunction(data, niftyInfo, moreNiftyInfo); 
    }; 

    // Trigger the request 
    script = document.createElement('script'); 
    script.src = url; 
    document.documentElement.appendChild(script); 
} 

理想的情況是,做JSONP當你每次自動生成回調的名稱,以便它是具體的要求(如果你有在同一時間兩個突出的請求):

// Assume the url ends with "callback=" and we append the name of the 
// callback function to it 
function doJSONP(url, niftyInfo, moreNiftyInfo) { 
    var cbname, script; 

    // Get a callback name 
    cbname = "callback_" + 
       new Date().getTime() + 
       "_" + 
       Math.floor(Math.random() * 10000); 

    // Set up the callback 
    window[cbname] = function(data) { 
     // Remove us from the window object 
     try { 
      delete window[cbname]; 
     } 
     catch (e) { // Handle IE bug (throws an error when you try to delete window properties) 
      window[cbname] = undefined; 
     } 

     // Runs the function 
     newCallbackFunction(data, niftyInfo, moreNiftyInfo); 
    }; 

    // Trigger the request 
    script = document.createElement('script'); 
    script.src = url + encodeURIComponent(cbname); 
    document.documentElement.appendChild(script); 
} 
+0

這是完美的!正是我在找什麼!是的,我爲每個特定的調用自動生成,只是不知道如何在觸發時將其他數據傳入回調。謝謝你的幫助! – spez86 2011-12-19 15:46:46

+0

@ spez86 :-)很高興幫助! – 2011-12-19 15:49:23

0

參數在JavaScript作爲數組傳遞,這樣你就可以通過你需要將你的回調每箱功能添加的參數,甚至是功能齊全。

你可以做到以下幾點:

function newCallBackFunction(root /*your data*/, paramsHash /*a hash array with optional parameters*/) 
{ 
    //if arg1 can be found in the hash 
    if(paramsHash['arg1'] ] 
    { 
     //do something that requires arg1 
    } 
    else if(paramsHash['arg2']) 
    { 
     //do something that requires arg2 
    } 


    return root; 

} 

而在你的主代碼:

var hash = new Array(); 
hash['arg1'] = 'str1'; 
hash['arg2'] = 1; 
hash['arg3'] = new Car(); //or any other object you want 

它也可能只是聲明一些參數,並將其提供給您的功能只在需要時:

function newCallBackFunction(root, param1, param2) 
{ 
    if(param1) { /* similar to first example */ } 
}  

或者最後只是傳遞你想要的任何參數並從參數中讀取它們表

function newCallBackFunction(root) 
{ 
    for(int i = 1; i < arguments.length; i++) 
    //do something with the parameters you pass beside root 
}  

而且在主代碼:

newCallBackFunction(root, param1, param2, param3); 

我希望我罩着你!

+0

*「JavaScript中的參數作爲數組傳遞」*不,它們不是。傳遞參數的基本機制是依賴於實現的,但它們最終成爲調用函數時生成的*變量環境*的*綁定對象的屬性(參見[10.4.3](http:// es5.github.com/#x10.4.3)和規範10.5)。 'arguments'對象不是一個數組(雖然它有一些類似數組的行爲),並且在大多數實現中,只有在函數中使用它(以運行時成本,在某些引擎上爲重要的引擎)時纔會創建它。 – 2011-12-19 16:00:29