Java:如何使用 Vertx 按顺序运行连续的异步调用?

标签 java loops asynchronous vert.x

假设我们有以下情况:

public static void main(String[] args) {
    Vertx vertx = Vertx.vertx();
    String alphabet = "AB";
    String[] splittedAlphabet = alphabet.split("");

for (int i = 1; i <= 5; i++) {
    List<String> list = Arrays.asList(splittedAlphabet);
    Iterator<String> iterator = list.iterator();
    final int number = i;

    //async call
    vertx.setPeriodic(1000, id -> {
        if (iterator.hasNext()) {
            System.out.println(iterator.next() + " i: " + number);
        } else {
            vertx.cancelTimer(id);
        }
    });

}
}

我们有一个外部 for-Loop 和一个内部 vertx.setPeriodic{}-Loop,它异步打印索引号 i 。外部 for 循环为每个索引号触发内部 Vertx 循环的五个异步调用。这个内部循环迭代每个字符(在我们的例子中是“A”和“B”)。这意味着每个索引号都与每个字符相结合,这是异步调用的。这就是为什么不能保证输出的顺序。 这就是我得到的:

A i: 1
A i: 2
A i: 5
A i: 4
A i: 3
B i: 4
B i: 5
B i: 1
B i: 3
B i: 2

但我想要得到的是(并保持内部循环异步):

A i: 1
A i: 2
A i: 3
A i: 4
A i: 5
B i: 1
B i: 2
B i: 3
B i: 4
B i: 5

这可能吗?

最佳答案

我自己找到了解决方案:

private static Vertx vertx = Vertx.vertx();

    public static void main(String[] args) {

        String alphabet = "AB";
        String[] splittedAlphabet = alphabet.split("");
        List<String> list = Arrays.asList(splittedAlphabet);
        iterate(list.iterator());
    }

    public static void iterate(Iterator<String> characters) {
        if (characters.hasNext()) {
            asyncCall(characters);
        } else {
            vertx.close();
        }
    }

    private static void asyncCall(Iterator<String> characters) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        numbers.add(5);

        Iterator<Integer> numberIterator = numbers.iterator();
        final String character = characters.next();

        vertx.setPeriodic(1000, id -> {
            if (numberIterator.hasNext()) {
                System.out.println(character + " i: " + numberIterator.next());
            } else {
                vertx.cancelTimer(id);
                iterate(characters);
            }
        });

    }

关于Java:如何使用 Vertx 按顺序运行连续的异步调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46063194/

相关文章:

Java Swing 运行后重启定时器

r - 删除数据帧中的最后一个值,将该行绑定(bind)到同一数据帧,并在第一列中设置零,重复 100 次

c# - 在 EF 的 DbContext.SaveChangesAsync() 中引发异步事件

javascript - async.parallel 中的回调如何工作(它来自哪里?)

java - 使用正则表达式过滤并查找字符串中的整数

java - 从小程序调用 JS 在 Firefox 和 Chrome 中有效,但在 Safari 中无效

java - 调用时如何使静态属性求值

java - Iterator 的 remove 方法实际上是如何删除一个对象的

python - 在 Python 中遍历日期

javascript - 如何在 Apollo Client React 中获取多个条件查询?