2013-09-23 81 views
1

如果这是一个重复的问题,我很抱歉。我已经完成了我的研究,但我仍然无法想出一个答案:JSONP回调不按顺序

我在写一个小的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变量。这是getJsonp功能,程序员在此过程中的步骤2调用:

jsonpRequest.prototype.getJsonp = function(){ 

    that.buildRequest(); 
    that.fetchJsonp(); 

    return that.listOfResults; 

}; 

问题:

这里是我打电话后,我确定我的JSON API类:

  var myJSON = json.getJsonp(); 

     console.log(myJSON); 

由于它是异步的,它在调用回调函数之前移动到控制台日志,导致MYJSONundefined。我不知道如何将我的代码以这种方式连接起来,然后再继续前进。

我试图效仿How can I get this JSONP call to return a value?的解决方案。我可能会错过一个步骤,或者我可能对某些事情一无所知!任何帮助澄清这将不胜感激。先谢谢你 :)。

P.S.我想避免使用JQuery等......将它严格保存为原始JavaScript是有益的。

+0

为了查看'myJSON'的值,您必须等到服务器响应返回。尝试使用'setTimeout'进行测试。您无法使用异步数据设置变量并立即预期结果。 – hitautodestruct

+0

嘿有hitautodestruct,谢谢你的建议:)。我意识到'setTimeout'是一个可能的解决方案。这是一个非常有效的解决方案。但是,我不愿意在http://stackoverflow.com/questions/17465011/how-can-i-get-this-jsonp-call-to-return-a-value中的Relfor点之后这样做。不过,如果服务器没有响应,我也许可以实现'setTimeout'作为失败保护。谢谢! – Mark

+0

嘿,只是一个FYI的setTimeout不是一个好的解决方案,因为你永远不知道到底需要多少时间来服务器响应。我只是为了测试目的而提出它。 – hitautodestruct

回答

2

我不确定如何将我的代码以菊花链方式连接在一起,然后再继续前进。

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

jsonpRequest.prototype.processCallback = function(data){ 

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

}; 
+0

谢谢!这非常有道理 - 读完之后我有一段时间了,它使这个过程变得更有意义。我实现了代码,去试试看,服务器似乎已经停止了!哈哈。我会尽快检查代码,如果一切正常,我会将其标记为已回答:) – Mark

+0

像魅力一样工作。非常感谢您帮助我在头脑中完成这个过程:)。 – Mark