Вы говорите о 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);
}
Это прекрасно! Именно то, что я искал! И да, я автоматически генерирую для каждого конкретного вызова, просто не был уверен, как передавать другие данные в обратный вызов, когда он уволен. Спасибо за вашу помощь! – spez86
@ spez86: :-) Рад, что помогло! –