JSONP回调乱序

时间:2013-09-23 13:57:22

标签: javascript json callback 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()

  3. 这会将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);
    

    因为它是异步的,所以它会在调用回调函数之前转到控制台日志,从而导致MYJSONundefined。我不知道如何以一种在运行回调之前运行回调的方式将我的代码连接在一起。

    我试图从How can I get this JSONP call to return a value?模拟解决方案。我可能错过了一步,或者我可能对某些事情一无所知!任何帮助澄清这一点将不胜感激。提前谢谢你:)。

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

1 个答案:

答案 0 :(得分:2)

  

我不确定如何以一种在运行回调之前运行回调的方式将我的代码连接在一起。

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

jsonpRequest.prototype.processCallback = function(data){

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

};