Передача параметров в функцию Window [callback] - PullRequest
1 голос
/ 19 декабря 2011

У меня есть код, который запрашивает JSON из API. Когда данные возвращаются, согласно документации, он отправляет обратно функцию обратного вызова, которая должна использоваться для анализа данных на верхнем уровне. После того, как вызов сделан, у меня есть следующий код для сбора данных и их обработки:

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

Как бы я мог передать пользовательские параметры в функцию обратного вызова выше, когда данные возвращаются?

Чтобы получить данные, я должен написать функцию обратного вызова следующим образом:

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

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

Вы говорите о 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 голосов
/ 19 декабря 2011

Параметры в 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 );

Надеюсь, я вас охватил!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...