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

jQuery Ajax / .each回调,在ajax完成之前下一个'each'触发

万俟浩
2023-03-14
问题内容

嗨,下面的Javascript是在我提交表单时调用的。它首先从文本区域分割一堆网址,然后:

1)在表格中为每个网址添加行,并在最后一列(“状态”列)中显示“未开始”。
2)再次循环遍历每个URL,首先它进行ajax调用以检查状态(status.php),该状态将返回0到100之间的百分比
。3)在同一循环中,它通过ajax启动实际过程(process.php),当进程完成时(请记住连续的状态更新),它将在状态栏中说“已完成”并退出auto_refresh。
4)然后应转到下一个“每个”并对下一个URL进行相同的操作。

function formSubmit(){

    var lines = $('#urls').val().split('\n');

    $.each(lines, function(key, value) {
        $('#dlTable tr:last').after('<tr><td>'+value+'</td><td>Not Started</td></tr>');
    });

    $.each(lines, function(key, value) {

        var auto_refresh = setInterval( function () {
            $.ajax({
              url: 'status.php',
              success: function(data) {
            $('#dlTable').find("tr").eq(key+1).children().last().replaceWith("<td>"+data+"</td>");
              }
            });
        }, 1000);

        $.ajax({
          url: 'process.php?id='+value,
          success: function(msg) {
        clearInterval(auto_refresh);
        $('#dlTable').find("tr").eq(key+1).children().last().replaceWith("<td>completed rip</td>");
          }
        });

    });

}

问题答案:

您想要 按顺序 运行几个异步操作,对吗?我将构建一个函数数组,以通过序列助手执行和运行它。

https://github.com/michiel/asynchelper-
js/blob/master/lib/sequencer.js

var actions = [];
$.each(lines, function(key, value) {

    actions.push(function(callback) {
      $.ajax({
          url: 'process.php?id='+val,
          success: function(msg) {
            clearInterval(auto_refresh);

            //
            // Perform your DOM operations here and be sure to call the
            // callback!
            //

            callback();
          }
        });
    });
  }
);

如您所见,我们构建了一个范围函数的数组,这些函数将一个任意回调作为参数。音序器将为您运行它们。

使用github链接中的序列帮助器并运行,

var sequencer = new Sequencer(actions);
sequencer.start();

顺便说一句,可以在几行代码中定义定序器功能。例如,

function sequencer(arr) {
    (function() {
        ((arr.length != 0) && (arr.shift()(arguments.callee)));
    })();
}


 类似资料:
  • 问题内容: (做了很多修改,因为它是类的一部分,等等。) 目前,这有点让人讨厌,因为计时器的使用似乎很垃圾。我会使用$ .when和$ .done,但是我不知道可能有多少房间,所以我不知道什么时候放什么。 如何确保仅在所有AJAX请求返回后才调用run_the_rest_of_the_app()? 问题答案: 在进行AJAX调用之前, 完成AJAX调用后(在回调中):

  • 我对RxJava并不完全陌生,但我被一项看似简单的任务所阻碍。 我有一个数据源,它公开了一个反应式API,我所要做的就是获取一些数据,返回它,并在没有其他消息发出时自动关闭连接。 这是我的代码: conn.query()和conn.close()在不同的调度程序中异步执行。此代码不起作用,因为conn.close()返回一个没有订阅服务器的Completable。此外,如果我手动订阅doOnCom

  • 我有多个具有多个选择限制的无线电组,一个是by name属性,另一个是jQuery。对于每个无线电组,我在更改时将checked属性设置为false,这样每个组只能检查一个无线电。 HTML jQuery 这只适用于第一组,有什么建议吗? 编辑: 使用类选择器而不是ID: HTML jQuery

  • each既是一个类方法,同时也是一个对象方法,两个方法适用场景不同;换言之,你可以使用mui.each()去遍历数组或json对象,也可以使用mui(selector).each()去遍历DOM结构。 mui.each( obj , handler ) obj Type: Array||JSONObj 需遍历的对象或数组;若为对象,仅遍历对象根节点下的key handler Type: Funct

  • 描述 (Description) 在列表上下文中调用时,此函数返回一个2元素列表,该列表由哈希的下一个元素的键和值组成,以便您可以迭代它。 在标量上下文中调用时,仅返回散列中下一个元素的键。 语法 (Syntax) 以下是此函数的简单语法 - each HASH 返回值 (Return Value) 在列表上下文中调用时,此函数返回一个2元素列表,该列表由哈希的下一个元素的键和值组成,以便您可以

  • An asynchronous version of Sequence#each. Signature AsyncSequence.each = function(fn) { /*...*/ } AsyncSequence.each = function each(fn) { var iterator = this.parent.getIterator(), onNextCallback