我有一些代码从API请求一些JSON。返回数据时,根据文档,它会发回一个回调函数,用于解析顶层的数据。调用完成后,我有以下代码来捕获数据并处理它:
var callback = 'functionUsedInApiCall';
window[callback] = newCallBackFunction;
在返回数据时,如何将自定义参数传递给上面的回调函数?
为了捕获数据,我必须编写回调函数,如下所示:
function newCallBackFunction(root) {
//root is the data
}
非常感谢任何帮助。
答案 0 :(得分: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);
}
答案 1 :(得分: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 );
我希望我能覆盖你!