Javascript 如何在循环中链接承诺,并等待所有循环的完成?

Javascript 如何在循环中链接承诺,并等待所有循环的完成?,javascript,loops,promise,Javascript,Loops,Promise,我在一个对象上迭代,每次迭代都执行一个ajax调用。 我需要: 按顺序执行ajax调用 只有在完成所有ajax调用后才执行某些操作 我能够分别实现上述每一个目标,但不能同时实现这两个目标 下面是我的代码的简化版本 使用承诺。将与承诺一起推。所有都实现了等待循环完成的目标 使用return my\u ajax\u fn()(在下面的代码中注释掉)可以实现按顺序执行调用的目标 但我如何实现这两个目标呢 function my_ajax_fn(index, value){ return $.a

我在一个对象上迭代,每次迭代都执行一个ajax调用。 我需要:

  • 按顺序执行ajax调用
  • 只有在完成所有ajax调用后才执行某些操作
  • 我能够分别实现上述每一个目标,但不能同时实现这两个目标

    下面是我的代码的简化版本

    使用
    承诺。将
    承诺一起推。所有
    都实现了等待循环完成的目标

    使用
    return my\u ajax\u fn()
    (在下面的代码中注释掉)可以实现按顺序执行调用的目标

    但我如何实现这两个目标呢

    function my_ajax_fn(index, value){
        return $.ajax({
        url: site_url,
        type: "POST",            
        success: function(data) { 
            // do some stuff
            }});
    }
    
    
    function test_done() {
        var promises = [];
        
        for (const [index, value] of Object.entries(answers)){
            if (index!=0) {
                p1 = p1.then(function() { 
                promises.push(my_ajax_fn(index, value));
    //          return my_ajax_fn(index, value);
                });
               };
        };
        
        Promise.all(promises)
        .then(() => {
            // do stuff after all the ajax calls are done
        })
        .catch((e) => {
            // handle errors here
        });
        
        }
    

    您可以通过在回调中返回承诺来链接承诺:

    p1 = p1.then(()=>my_ajax_fn(index_value))
    
    这会导致承诺链接到返回的承诺上,这是由
    my\u ajax\u fn()返回的承诺

    也考虑使用语法。语法可以写成:

    异步函数testDone(){}
    等待my_ajax_fn()


    允许类似于编写同步代码的语法,该语法更简洁、更易于阅读和理解,并且通常比。

    对一系列异步操作进行排序的最简单方法是使用
    async/await
    。这也将使我们很容易知道他们何时完成:

    async function test_done() {
        for (const [index, value] of Object.entries(answers)){
            if (index != 0) {
                await my_ajax_fn(index, value);
            }
        }
        console.log("all done now");
    }
    
    从该函数的外部,它返回一个承诺,以便您可以使用该承诺来知道何时完成:

    test_done().then(() => {
        console.log("all done");
    }).catch(err => {
        console.log(err);
    });
    

    因此,如果我声明
    async function testDone(){}
    并在其中使用
    for await
    而不是
    for
    ,那么写在循环下面的任何代码都将等待循环完成后再执行?它将等待等待之后的承诺(或异步)得到解决,然后再继续。for await of将在从iterable返回的每个Promise/async上等待,在
    之后。比如迭代承诺(或异步)。