javascript中的非阻塞代码问题
我想做一个暴力投票脚本javascript中的非阻塞代码问题,javascript,jquery,ajax,blocking,Javascript,Jquery,Ajax,Blocking,我想做一个暴力投票脚本 $('#vote').click(function(e) { var noOfvotes = 0; var noOfattempt =0; var noOffail =0; for(var i =0 ; i<500;i++){ $.ajax({ url: 'http://www.example.com/survey/'
$('#vote').click(function(e) {
var noOfvotes = 0;
var noOfattempt =0;
var noOffail =0;
for(var i =0 ; i<500;i++){
$.ajax({
url: 'http://www.example.com/survey/',
type: 'POST',
data: {poll: '123',
vote:"option3"
},
})
.done(function() {
noOfvotes++;
})
.fail(function() {
noOffail++;
})
.always(function() {
noOfattempt++;
});
}
//Result printing
console.log('No of attempt :' + noOfattempt);
console.log('No of done :' + noOfvotes);
console.log('No of fail :' + noOffail);
});
但我需要在所有Ajax请求完成后执行这些行。如何为这种情况生成阻止代码。将请求堆叠在一个数组中,并使用$。确定它们何时全部完成
$('#vote').click(function (e) {
var XHR = [],
noOfvotes = 0,
noOfattempt = 0,
noOffail = 0;
for (var i = 0; i < 500; i++) {
XHR.push(
$.ajax({
url: 'http://www.example.com/polling/',
type: 'POST',
data: {
poll: '123',
vote: "option3"
},
}).done(function () {
noOfvotes++;
}).fail(function () {
noOffail++;
}).always(function () {
noOfattempt++;
})
);
}
$.when.apply(undefined, XHR).done(function() {
console.log('No of attempt :' + noOfattempt);
console.log('No of vote :' + noOfvotes);
console.log('No of fail :' + noOffail);
});
});
将日志语句移动到.always中,并检查noofattempty是否等于您尝试的数量
.always(function() {
noOfattempts++;
if (noOfattempts === 500) {
// we're done
}
})
然后像这样使用它:
custom_when(requests).then(...);
阅读有关回调的文章,我认为你没有理解回调的全部意义。它们的存在是因为您不希望阻止请求。您需要改变方法,而不是使用阻塞代码,以便在回调中调用响应所需的任何内容。将打印结果放入ajax函数的成功回调中。doneWell发出500个silmutanous请求只会给您带来问题……同时发送500个XHR请求不是一个好主意。你为什么一开始就试图欺骗民意调查?什么是Noofattemp、noOfvotes和noOffail???如何更新相应的值?请注意,在使用时。如果其中一个承诺被拒绝,它将立即触发,因为ajax调用失败。@A.Wolff谁在乎?这些变量无关紧要。@freakish-这没有多大帮助,我也错了,因为只有在它们都成功的情况下才会触发。@adeneo确实在这里,那么回调就相当于成功回调了。非常感谢。我不知道函数的作用和应用
$('#vote').click(function(e) {
// some code
var requests = [];
for(var i = 0; i < 500; i++){
requests.push($.ajax({ ... }));
}
$.when.apply($, requests).then(function() {
console.log('No of attempt :' + noOfattempt);
console.log('No of vote :' + noOfvotes);
console.log('No of fail :' + noOffail);
});
});
var custom_when = function(reqs) {
var def = $.Deferred(),
counter = reqs.length;
for (var i = 0; i < counter; i++) {
reqs[i].always(function() {
counter--;
if (!counter) {
def.resolve();
}
});
}
return def.promise();
};
custom_when(requests).then(...);