AJAX请求不起作用,除非使用alert()
AJAX request not working unless alert() is used
我正在进行http请求,以获取一些信息并将其显示在条形图中。除非我包含alert(" ")
,否则它不起作用
几乎所有事情都很好,但没有alert()
,图表就不起作用。我该如何解决这个问题?
app.controller('StatisticsCtrl', function ($scope, GitHubService) {
// funktioniert - Test
var getFollowedTmp = 0;
var getFollowersTmp = 0;
var getStarredTmp = 0;//Favoriten
GitHubService.getFollowed(function (data) {
getFollowedTmp = data.length;
});
GitHubService.getFollowers(function (data) {
getFollowersTmp = data.length;
});
GitHubService.getStarred(function (data) {
getStarredTmp = data.length;
});
alert("");
var ctx = document.getElementById("profChart");
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: ["Followers", "Following", "Starred"],
datasets: [{
label: 'Quantity',//Anzahl
backgroundColor: "rgba(0,51,48,0.2)",
borderColor: "rgba(0,51,48,0.2)",
borderWidth: 1,
data: [getFollowersTmp, getFollowedTmp, getStarredTmp]
}]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero:true
}
}]
}
}
});
});
方法是异步的。当您调用alert(")时,您会阻止执行到下一行,从而给github服务运行和返回的时间。
下面是一个使用Jquery进行切换的示例。其他js框架也会有类似的概念。
var task1 = $.getJSON("http://resourceUri");
var task2 = $.getJSON("http://resourceUri2");
$.when(task1, task2).done(function(task1Response, task2Response){
var task1Result = task1Response[0];
var task2Result = task2Response[0];
//Do something with the data. Charting?
});
没有alert
它就不起作用的原因是GitHubService
调用是异步的,所以在渲染图表时数据不在那里。
它与alert
一起工作的原因是alert
暂停了执行(公平地说,这有点神奇),所以当您解除警报时,请求已经完成。
在呈现图表之前,您需要等待三个GitHub服务调用完成。
这可以这样实现:
function tryRender() {
if (getFollowedTmp && getFollowersTmp && getStarredTmp) {
var myChart = new Chart(...);
}
}
GitHubService.getFollowed(function (data) {
getFollowedTmp = data.length;
tryRender();
});
GitHubService.getFollowers(function (data) {
getFollowersTmp = data.length;
tryRender();
});
GitHubService.getStarred(function (data) {
getStarredTmp = data.length;
tryRender();
});
然而,这并不过分优雅。如果您的GitHubService
调用返回promise(许多ajax库都这样做),您可以执行以下操作:
Promise.all([
GitHubService.getFollowed(),
GitHubService.getFollowers(),
GitHubService.getStarred()
]).then(function(result) {
var getFollowedTmp = result[0].length;
var getFollowersTmp = result[1].length;
var getStarredTmp = result[2].length;
var myChart = new Chart(...);
});
"删除阻塞调用会破坏我的代码"的一个常见原因是,阻塞调用为浏览器加载资源提供了时间。
在您的情况下,我认为getFollowersTmp, getFollowedTmp, getStarredTmp
没有及时初始化。
解决这个问题的方法之一是使用AngularJS的$q
来确保在继续之前加载所有依赖项。
相关文章:
- ajax请求的顺序总是不同的
- Meteor如何接收HTTP请求
- 有没有一种方法可以防止img get请求使用css或js发生
- 从ajax请求中获取javascript对象
- JSONP请求返回结果,但也触发error_callback
- 在localhost Dev Box上测试JSONP请求的最佳方式
- Ajax请求文档就绪会导致jquery加载缓慢
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- 在openshift node js应用程序中获取请求
- 反应路由器弄乱了请求网址
- 在我的情况下,如何进行http请求
- 使用密码对话框Javascript请求帮助
- servlet中的请求对象,而不是从jsp接收参数值
- 否'访问控制允许来源'标头存在于IISNOde中请求的资源(AngularJS+NodeJs)上
- JavaScript代码未正确检查ajax请求
- AJAX请求不起作用,除非使用alert()
- Ajax请求不会工作,除非我使用alert()
- 如何在所有ajax请求完成后调用alert
- avoid alert拒绝执行JavaScript脚本.在请求中找到的脚本源代码