将Params传递给窗口[callback]功能

时间:2011-12-19 15:29:42

标签: javascript parameters callback window

我有一些代码从API请求一些JSON。返回数据时,根据文档,它会发回一个回调函数,用于解析顶层的数据。调用完成后,我有以下代码来捕获数据并处理它:

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

在返回数据时,如何将自定义参数传递给上面的回调函数?

为了捕获数据,我必须编写回调函数,如下所示:

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

非常感谢任何帮助。

2 个答案:

答案 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 );

我希望我能覆盖你!