【问题标题】:$http returning error response NULL on first call after launch (ionic) everytime, but after subsequent http post its ok$http 在每次启动(离子)后第一次调用时返回错误响应 NULL,但在随后的 http 发布后它就可以了
【发布时间】:2016-08-10 01:17:59
【问题描述】:

每当我启动我的应用程序并在前几次尝试中单击登录时,登录都会尝试向服务器发送 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 设备上

更新

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

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: ""}

【问题讨论】:

    标签: http ionic-framework null


    【解决方案1】:

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

    另一种解决方法是尝试将与 http 请求相关的代码包装到

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

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

    【讨论】:

    【解决方案2】:

    当您使用 'success' promise 方法而不是 'then' 时,您可能会遇到这种不一致的行为(请注意,success 方法的使用现在已经是 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' 返回一个用回调返回的值解析的承诺,因此它应该给你一个一致有效的结果。

    【讨论】:

    • 感谢您的提示。我使用 $http.post.then 更新了代码,它仍然是相同的行为。前几次尝试失败然后successCallback。如果您愿意尝试,我已经根据您的建议更新了 github 中的代码。谢谢。
    • 我真的以为是成功的方法。当你说 $http 返回 null 你到底是什么意思?你的意思是 http 返回一个空承诺?当您获得空结果时,是否有任何 console.log 语句被输出?
    • 当前错误回调(响应)。 console.error('错误',响应); retuns this -----> ERROR, Object {data: null, status: 0, config: Object, statusText: ""}
    • previous code, }).error(function(err) { err 变量返回 null。好的,我应该更改标题。我的错。
    • 也有可能是你启动应用时连接没有初始化。也许您检查连接的方式存在问题(尽管看起来确实不错)。而不是使用“if (window.cordova){...”,您可以尝试“if(window.Connection) {...”参见this 示例。
    【解决方案3】:

    这是导致它的 app.js 中的超时。设置为 1 秒,这给了它任意的成功率。

    config.timeout = 1000;
    

    【讨论】:

    • Axil,您是否尝试按照我之前的建议将与 http 请求相关的代码包装到 $timeout() 中?
    • 可以,但我想这个 bug 没有必要
    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多