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(...);