【问题标题】:parse error callback function not called jquery ajax error?解析错误回调函数未调用jquery ajax错误?
【发布时间】:2016-10-03 20:47:20
【问题描述】:

我一直在尝试其他用户之前在堆栈溢出中看到的所有方法。但是它们都不起作用。希望你们中的任何人都能指出我正确的方向

$.ajax({
 type: "get",
 dataType:'jsonp',
 params:jsonData,
 jsonp:false,
 jsonpCallback:"callbackfn",
 headers: { "api_key": "u5FocU4xLq2rBfZ1ZSV8o81R2usYzUEM3NaCinnV"},
  url: "http://localhost/url?name=xxx&email=xxxxxx@gmail.com",
 success:function(){
  alert("sucess function");
   },
  error: function(jqXHR, textStatus, errorThrown){
       alert(textStatus + " and<br> " + errorThrown);
    }
  });
 function callbackfn(data) {
   alert(data);
  }

回复是{ "firstName":"John", "lastName":"Doe" }


虽然响应是json,但是会报错

解析错误 .callbackfn 未调用。

【问题讨论】:

  • @devlincarnate yes.not working
  • Javascript 实现了hoisting,所以移动函数减速不会改变任何东西@devlincarnate
  • @citysurrounded yes.exactly.and 你知道为什么会出现这个错误吗?
  • 可能是因为来自服务的响应不是有效的 JSON(因此出现解析错误)
  • @kevin 在这里查看这篇文章:stackoverflow.com/questions/37436728/… 描述如何在 AWS 上的 lambda 函数中容纳 jsonp 回调。这有帮助吗?我认为您的服务器没有正确设置来处理 jsonp。

标签: javascript jquery json ajax get


【解决方案1】:

为了在 JSONP 中使用自定义回调函数,您必须将其范围声明为全局,即

window.callbackfn = function(data) {
    alert(data);
};

为什么?

这是因为成功的 JSONP 响应返回一个新的 JavaScript 文件,即封装在 &lt;script&gt; 标签中的 JavaScript 函数调用。由于每个脚本都是在全局范围内独立评估的,因此您希望其他脚本可以使用的任何脚本函数也必须在全局范围内声明。因此所有 JSONP 回调函数都应该是全局的。


编辑

根据 OP,在这里找到的解决方案:Return JSONP via AWS Lambda/API Gateway 成功了。问题与不正确的服务器端 JSONP 响应有关。

【讨论】:

    【解决方案2】:

    确保来自服务器的响应是一个以响应数据作为参数的函数调用。看来您只是在输出 JSON,但 JSONP 需要一个带有响应数据的函数调用。您的服务器响应应如下所示:

    callbackfn({
      "firstName":"John",
      "lastName":"Doe"
    });
    

    您有 jsonp: falsejsonpCallbackdataType: 'jsonp' - 这很奇怪,因为您还提供了 jsonp 回调。也许如果您由于跨域请求而不需要 JSONP,您应该删除 jsonpCallback 参数并使用响应手动调用该函数:

    $.ajax({
       type: "get",
       dataType:'json',
       params:jsonData,
       headers: { "api_key": "u5FocU4xLq2rBfZ1ZSV8o81R2usYzUEM3NaCinnV"},
       url: "http://localhost/url?name=xxx&email=xxxxxx@gmail.com",
       success:function(data){
         callbackfn(data);
       },
       error: function(jqXHR, textStatus, errorThrown){
           alert(textStatus + " and<br> " + errorThrown);
        }
    });
    

    【讨论】:

    • M 我该如何检查?
    • 我不关注,您发布的响应是纯 JS 对象{ "firstName":"John", "lastName":"Doe" },但 JSONP 响应必须是包装在对提供的函数名称 (jsonpCallback=callbackfn) 的函数调用中的对象- 因此,服务器响应必须是我在答案中发布的内容。
    • 没有。响应就像我在问题中粘贴的代码一样。所以,我还有其他错误吗?
    • 错误是您提供了不正确的响应,并且 A) 无法在此后端使用 JSONP 或 B) 需要更改后端以以我发布的格式提供响应。请参阅stackoverflow.com/questions/3839966/… 了解 JSONP 的工作原理
    • 但如果我这样做,就会出现跨源请求问题。这就是我使用 jsonp 的原因
    猜你喜欢
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    相关资源
    最近更新 更多