当前位置: 首页 > 面试题库 >

异步的替代:错误的ajax

慕铭
2023-03-14
问题内容

我遍历一个数组,每个数组都运行ajax请求。我需要按顺序执行请求,因此我可以接听最后一个请求并成功运行一个函数。

目前我正在运行(简体):

$.each(array, function(i, item){
    ajax_request(item.id, item.title, i);
})

function ajax_request(id, title, i){
    $.ajax({
        async: false,
        url: 'url here',
        success: function(){
            if(i == array.length-1){
                // run function here as its the last item in array
            }
        }
    })
}

但是,使用async:false会使应用程序无响应/变慢。但是,如果没有async:false,有时其中一个请求会挂起并在最后发送的ajax请求返回后实际上返回。

我如何不使用async:false来实现呢?


问题答案:

您可以使用本地函数来运行ajax调用,并且在每个后续的成功处理程序中,可以启动下一个ajax调用。

function runAllAjax(array) {
    // initialize index counter
    var i = 0;

    function next() {
        var id = array[i].id;
        var title = array[i].title;
        $.ajax({
            async: true,
            url: 'url here',
            success: function(){
                ++i;
                if(i >= array.length) {
                    // run function here as its the last item in array
                } else {
                    // do the next ajax call
                    next();
                }

            }
        });
    }
    // start the first one
    next();
}

在2016年使用使用promises的选项更新此答案。这是您依次运行请求的方式:

array.reduce(function(p, item) {
    return p.then(function() {
        // you can access item.id and item.title here
        return $.ajax({url: 'url here', ...}).then(function(result) {
           // process individual ajax result here
        });
    });
}, Promise.resolve()).then(function() {
    // all requests are done here
});

这是并行运行它们的方式,并返回所有结果:

var promises = [];
array.forEach(function(item) {
    // you can access item.id and item.title here
    promises.push($.ajax({url: 'url here', ...});
});
Promise.all(promises).then(function(results) {
    // all ajax calls done here, results is an array of responses
});


 类似资料:
  • 但是,如果我在两个连续的'>'字符之间放置空格,则不会产生错误。ANTLR无法区分上述规则和用于识别移位表达式的规则,但我不知道如何修改语法来解决这种歧义。如有任何帮助,不胜感激。

  • 编写JavaScript代码时,我们要时刻牢记,JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行,而回调函数的执行需要等到下一个满足条件的事件出现后,才会被执行。 例如,setTimeout()函数可以传入回调函数,并在指定若干毫秒后执行: function printTime() { console.log('It is time!'); } setTimeout

  • 问题内容: 我对Node.js并不陌生,尽管我通常对JavaScript非常熟悉。我的问题是关于如何处理node.js中的错误的“最佳实践”。 通常,在对Web服务器,FastCGI服务器或各种语言的网页进行编程时,我在多线程环境中使用带有阻止处理程序的Exceptions。当有请求进入时,我通常会执行以下操作: 这样,我始终可以处理内部错误并向用户发送有效响应。 我知道使用node.js可以执行

  • 问题内容: 我是bash脚本的新手,但我不理解为什么它不起作用 第3行的替代替换错误 问题答案: 该替换在Bash 4.2.8中正常工作(并且根据文档看起来还不错)。 我最好的猜测是您实际上并没有使用Bash-您如何调用脚本?如果您正在执行此操作,则可能会与Dash或类似的程序一起运行(Dash确实在第3行给出了替换错误)。尝试使用Bash()显式运行它。 如果事实证明您实际上是在使用Dash,这

  • 异步代码是指当调用后不会立即完成的代码。 setTimeout(() => { console.log('do stuff'); }, 3000 ) 在 setTimeout 执行完3秒后 do stuff 会输出到控制台。我们可以看出当指定的时间过去后我们所提供的异步函数会触发。现在来看个更有启发性的示例: doWork( () => { console.log('call me whe

  • 问题内容: 我有一个Express中间件,因为我想在其中使用中间件来清理我的代码。 问题在于,当它拒绝时,它不会进入我的错误中间件,但是如果我删除了关键字,并且在中间件中,它将删除。 所以我得到的不是输入我的错误处理中间件,而是如何让错误冒泡并表达处理它? 问题答案: 问题是当它拒绝时,它不会进入我的错误中间件,但是如果我删除了async关键字并扔进了中间件中,它就会去。 目前不支持诺言,将来的版