每次启动(离子)后第一次调用时$ http返回错误响应NULL,但是在后续的http发布后确定

时间:2016-04-18 10:40:54

标签: http null ionic-framework cors

每当我启动我的应用程序,并在前几次尝试时单击登录时,登录将尝试向服务器发送POST http。但是$ http总是(每次)在第一次尝试时返回NULL。如果快速完成,有时几次尝试仍然是NULL。但随后,一切都好。

我不明白,为什么$ http最初会返回错误响应NULL?

这是我的登录控制器在做http帖子

登录控制器(LoginCtrl) https://gist.github.com/anonymous/771194bc5815e4ccdf38b57d6158853f

var req = {
  method: 'POST',
  url: baseURL,
  data: postObject,
  //timeout: 5000
};

这里的错误是NULL:

}).error(function(err) {

我不知道它是否是CORS但是我已经在config.xml中设置了这个

 <access origin="*" />

我的config.xml https://gist.github.com/anonymous/b2df3a857338d14ec3fcd6dda776e212

有什么想法吗? 我使用离子1.7.14 在iOS 9.3.1设备上

更新

我已将问题代码放在此处。可以先注销到goto登录界面。输入用户名/密码字段中的任何内容,单击登录失败,第二次或第三次尝试将成功。

https://github.com/axilaris/ionic_null_http_problem

到目前为止的一些故障排除:我注意到http post请求被调用了两次。不知道为什么。

使用$ http.post.then更新代码,但仍具有相同的效果

 $http.post(baseURL, postObject).then(function successCallback(response)

 response has NULL data --> Object {data: null, status: 0, config: Object, statusText: ""}

3 个答案:

答案 0 :(得分:0)

仅仅具有上述细节很难诊断。 但问题可能是你的处理程序(登录函数)在摘要周期完成更新$ scope.data.username和$ scope.data.password之前被触发,并且在第一次尝试时它会将那些值发送到服务器并在以后工作正常。 您可以运行Safari Web检查器以查看发送到服务器的内容以证明这一点。 修复程序可能取决于您的视图/模板的编码方式。你能分享一下吗?或者,理想情况下,在http://play.ionic.io/

创建一个工作样本

修复的另一个选择是尝试将与http请求相关的代码包装到

$timeout(function() { 
    // your code goes here
});

或者,考虑使用。$ applyAsync()(有关详细信息,请参阅文档) 这可能有助于解决问题

答案 1 :(得分:0)

您可能会因为使用“成功”承诺方法而不是“然后”而得到这种不一致的行为(请注意,成功方法的使用现在已经deprecated)。

这两种方法的主要区别是:

  
      
  • then() - promise API的全部功能,但稍微更详细
  •   
  • success() - 不会返回一个承诺,但会提供稍微方便的语法
  •   

this回答中突出显示。

因此,在您的方案中,而不是使用“成功”:

var req = {
  method: 'POST',
  url: baseURL + 'session/login',
  data: postObject,
  //timeout: 5000
};

$http(req).success(function(resp) {...

使用'then'和angular post快捷方法(您不必使用此快捷方法,但我认为它使代码更简洁),例如:

$http.post(baseURL + 'session/login', postObject).then(function successCallback(response) {
  // this callback will be called asynchronously
  // when the response is available
}, function errorCallback(response) {
  // called asynchronously if an error occurs
  // or server returns response with an error status.
});

使用'then'返回一个使用回调返回的值解析的promise,因此它应该为您提供始终有效的结果。

答案 2 :(得分:0)

app.js中的超时导致了它。被设定为1秒,这使它具有任意的成功率。

file_1