【发布时间】:2013-09-28 11:05:44
【问题描述】:
如果这是一个重复的问题,我深表歉意。我已经完成了我的研究,但我仍然无法找到答案:
我正在编写一个小型 JSONP API。期望的结果:
-
程序员创建 JSON 类的一个实例。
var json = new jsonpRequest ( "http://url.to.web_service", searchParam //passed in as an associative array ); 然后程序员声明
var myJSON = jsonpRequest.getJsonP()
这会将 JSONP 返回到要处理的 myJSON 变量中。
API 在构造类的实例时成功接收参数,生成带有所需参数的服务链接,并使用此函数通过脚本标签将其注入 DOM:
jsonpRequest.prototype.fetchJsonp = function(){
var request = that.getRequest();
//creates a script element
var jsonpCall = document.createElement('script');
//gets jsonp request
jsonpCall.src = request;
//adds script to DOM, which goes on to request the JSONP from the service.
document.head.appendChild(jsonpCall);
};
编辑:为了清楚起见:这肯定会返回所请求的数据集。
我用作回调的函数是:
jsonpRequest.prototype.processCallback = function(data){
alert(data);
that.setListOfResults(data);
};
在链接中称为:&callback=jsonpRequest.prototype.processCallback
processCallback 函数从请求中获取数据,并使用setListOfResults 函数将其存储在类中的一个变量中。
存储数据后,我想将请求中的数据返回到myJSON 变量。这是程序员在流程的第 2 步中调用的 getJsonp 函数:
jsonpRequest.prototype.getJsonp = function(){
that.buildRequest();
that.fetchJsonp();
return that.listOfResults;
};
问题:
这是我在定义我的 JSON API 类后调用的内容:
var myJSON = json.getJsonp();
console.log(myJSON);
因为它是异步的,所以在调用回调函数之前它会移动到控制台日志,导致MYJSON 变为undefined。我不确定如何以菊花链方式将我的代码链接在一起,以便在继续之前运行回调。
我试图模仿How can I get this JSONP call to return a value? 的解决方案。我可能错过了一步,或者我可能对某些事情一无所知!任何澄清这一点的帮助将不胜感激。提前谢谢你:)。
附:我想避免使用 JQuery 等......将其严格保留为原始 JavaScript 将是有益的。
【问题讨论】:
-
为了查看
myJSON的值,您必须等到服务器响应返回。尝试使用setTimeout进行测试。您不能使用异步数据设置变量并立即获得结果。 -
嘿,hitautodestruct,感谢您的建议 :)。我知道
setTimeout是一个可能的解决方案。这是一个完全有效的解决方案。但是,在 Relfor 在stackoverflow.com/questions/17465011/… 中提出的观点之后,我不愿意这样做。不过,如果服务器没有响应,我也许可以将setTimeout实现为故障保护:)。谢谢! -
嘿,仅供参考,setTimeout 不是一个好的解决方案,因为您永远不知道服务器响应需要多少时间。我建议它只是为了测试目的。
-
嘿,是的,这也是我的问题,不过感谢您建议它用于测试目的!
标签: javascript json callback jsonp