2011-12-19 3 views
0

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

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

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

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

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

+0

@ spez86: :-) Рад, что помогло! –

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' не является массивом (хотя он имеет некоторое поведение в виде массива), и в большинстве реализаций он создается только в том случае, если вы используете его в функции (и при затратах времени исполнения на некоторых двигателях значительная). –

Смежные вопросы