来自 API 的回调
Callback from API
我在 http://foobar.com/api?callback=mycallback
上有以下脚本:
var something = 'aaa';
var callback = mycallback;
(function() {
var output = eval(something);
callback(output);
});
我想从我自己的脚本访问这个脚本,并获取输出。所以我正在做以下事情:
var module1 = (function() {
var getFromApi = function(output) {
return (function(output) {
var script = document.createElement('script');
script.setAttribute('src', 'http://foobar.com/api?callback=mycallback');
document.getElementsByTagName('head')[0].appendChild(script);
});
};
var fetch = function() {
getFromApi(function(output) {
console.log(output);
});
};
return {
fetch: fetch
};
})();
module1.fetch();
结果应该是这个脚本的输出,其实不是,连回调都没有进入。我怎样才能正确地做到这一点?
模块 1 中存在一些问题:
- getFromApi returns 一个函数(我们称它为 fn)
- fn 有一个名为 output 的参数,它隐藏了外部函数的参数,使传递给 getFromApi 的参数变得无用
- fetch 调用 getFromApi 并且它什么都不做
- 回调函数必须是全局可访问的
可能的解决方案是:
var module1 = (function() {
var getFromApi = function(output) {
var script = document.createElement('script');
script.setAttribute('src', 'http://foobar.com/api?callback='+output);
document.getElementsByTagName('head')[0].appendChild(script);
};
var fetch = function() {
getFromApi('myfunction');
};
return {
fetch: fetch
};
})();
function myfunction(output) {
console.log(output);
}
module1.fetch();
作为回调函数的可能令人讨厌的解决方案(它在 IE 中不起作用,但可以修改)
var module1 = (function() {
var getFromApi = function(output) {
var script = document.createElement('script');
script.setAttribute('src', 'http://foobar.com/api?callback=eval(document.currentScript.dataset.fn)');
script.setAttribute('data-fn', '(function(){ return ' + output +'})()');
document.getElementsByTagName('head')[0].appendChild(script);
};
var fetch = function() {
return getFromApi(function(output){
console.log(output);
/*remember to remove script tag*/
document.currentScript.remove();
});
};
return {
fetch: fetch
};
})();
module1.fetch();
我在 http://foobar.com/api?callback=mycallback
上有以下脚本:
var something = 'aaa';
var callback = mycallback;
(function() {
var output = eval(something);
callback(output);
});
我想从我自己的脚本访问这个脚本,并获取输出。所以我正在做以下事情:
var module1 = (function() {
var getFromApi = function(output) {
return (function(output) {
var script = document.createElement('script');
script.setAttribute('src', 'http://foobar.com/api?callback=mycallback');
document.getElementsByTagName('head')[0].appendChild(script);
});
};
var fetch = function() {
getFromApi(function(output) {
console.log(output);
});
};
return {
fetch: fetch
};
})();
module1.fetch();
结果应该是这个脚本的输出,其实不是,连回调都没有进入。我怎样才能正确地做到这一点?
模块 1 中存在一些问题:
- getFromApi returns 一个函数(我们称它为 fn)
- fn 有一个名为 output 的参数,它隐藏了外部函数的参数,使传递给 getFromApi 的参数变得无用
- fetch 调用 getFromApi 并且它什么都不做
- 回调函数必须是全局可访问的
可能的解决方案是:
var module1 = (function() {
var getFromApi = function(output) {
var script = document.createElement('script');
script.setAttribute('src', 'http://foobar.com/api?callback='+output);
document.getElementsByTagName('head')[0].appendChild(script);
};
var fetch = function() {
getFromApi('myfunction');
};
return {
fetch: fetch
};
})();
function myfunction(output) {
console.log(output);
}
module1.fetch();
作为回调函数的可能令人讨厌的解决方案(它在 IE 中不起作用,但可以修改)
var module1 = (function() {
var getFromApi = function(output) {
var script = document.createElement('script');
script.setAttribute('src', 'http://foobar.com/api?callback=eval(document.currentScript.dataset.fn)');
script.setAttribute('data-fn', '(function(){ return ' + output +'})()');
document.getElementsByTagName('head')[0].appendChild(script);
};
var fetch = function() {
return getFromApi(function(output){
console.log(output);
/*remember to remove script tag*/
document.currentScript.remove();
});
};
return {
fetch: fetch
};
})();
module1.fetch();