Вы говорите о 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);
}