【问题标题】:JSONP callback out of orderJSONP 回调乱序
【发布时间】:2013-09-28 11:05:44
【问题描述】:

如果这是一个重复的问题,我深表歉意。我已经完成了我的研究,但我仍然无法找到答案:

我正在编写一个小型 JSONP API。期望的结果:

  1. 程序员创建 JSON 类的一个实例。

    var json = new jsonpRequest (
    
    "http://url.to.web_service",
    
    searchParam //passed in as an associative array
    
    );
    
  2. 然后程序员声明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


【解决方案1】:

我不确定如何以菊花链方式将我的代码链接在一起,以便在继续之前运行回调。

你不能这样做。您必须依赖回调。将callback 参数添加到您的jsonpRequest 构造函数,并在您执行setListOfResults(data) 之后调用该回调。您可能还希望允许设置将在其中执行回调的 this 上下文。

jsonpRequest.prototype.processCallback = function(data){

    alert(data);
    that.setListOfResults(data);
    that.callback.apply(that.context, [data]);

};

【讨论】:

  • 谢谢!这是完全有道理的——读完之后我有一个哈哈的时刻,它让这个过程变得更有意义。我实现了代码,去尝试了,服务器似乎已经宕机了!哈哈。我会尽快检查代码,如果一切正常,我会将其标记为已回答:)
  • 工作就像一个魅力。非常感谢您帮助我了解这个过程:)。
猜你喜欢
  • 2013-10-17
  • 2014-12-31
  • 2019-12-07
  • 2013-12-07
  • 2013-04-29
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多