每当我启动我的应用程序,并在前几次尝试时单击登录时,登录将尝试向服务器发送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: ""}
答案 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