在 for 循环中嵌套的 ajax 函数调用

Nested ajax function calls inside a for loop

提问人:Vimal 提问时间:12/1/2020 更新时间:12/2/2020 访问量:67

问:

我研究了许多使用延迟和承诺的解决方案。在我的场景中尝试了这些解决方案,但无法获得解决方案。我一整天都在战斗。我的情况是。

我有一系列的客户。我需要对每个客户一个接一个地执行一些特定的操作,这些操作被定义为ajax。

private function main()
{
    customers=["customer1","customer2"]
    customers.forEach(function(customer) {

        function1();
        function2();
        function3();

    }
}
private function function1()
{
     $.ajax({
                type: "POST",
                url: Url1,
                data: {},
                success: function (data) {
                    console.log("a");
                },
                dataType: 'JSON'
            });
}
private function function2()
{
     $.ajax({
                type: "POST",
                url: Url2,
                data: {},
                success: function (data) {
                    console.log("b");
                },
                dataType: 'JSON'
            });
}
private function function3()
{
     $.ajax({
                type: "POST",
                url: Url3,
                data: {},
                success: function (data) {
                    console.log("c");
                },
                dataType: 'JSON'
            });
}

调用 main 函数时。我想要的输出是

a
b
c
a
b
c

但我得到的输出是

a
a
b
b
c
c

请帮我找到解决方案。

JavaScript jQuery ajax 嵌套

评论


答:

0赞 Evgeniy 12/1/2020 #1

默认情况下,Ajax 调用是异步调用。行动。

function send() {
  fetch(
    url,
    {
      method: 'post',
      header: {'Content-Type' : 'application/text'},
      body: 'a'
    }
  ).then(
    () => {
      console.log('a is sended');
      fetch(
        url,
        {
          method: 'post',
          header: {'Content-Type' : 'application/text'},
          body: 'b'
        }
      ).then(
          () => {
            console.log('b is sended'); 
            fetch(
              url,
              {
                method: 'post',
                header: {'Content-Type' : 'application/text'},
                body: 'c'
              }
            ).then( () => console.log('c is sended') )
          }
        )
    }
  )
}

评论

0赞 Vimal 12/1/2020
是的,我知道。我不希望它使 async:false,因为它已被弃用。我正在寻找使用延迟或承诺的其他解决方案。
0赞 Vimal 12/2/2020
我试过了..与我的问题中提到的输出类似
0赞 Vimal 12/2/2020 #2

最后,我通过在不使用循环的情况下进行递归函数调用解决了我的问题。

var customers=["customer1","customer2"];
var currentIndex=0;
private function main()
{
  if(customers[currentIndex]){
   function1().done(function(data) {
     console.log("a");
      function2().done(function(data) {
        console.log("b");
        function3().done(function(data) {
          console.log("c");
           currentIndex++; 
           main();
        });
      });
   });
   
  }
}
private function1()
{
  return  $.ajax({
                type: "POST",
                url: url1,
                data: {},
                dataType: 'JSON'
            });
}
private function2()
{
  return  $.ajax({
                type: "POST",
                url: url2,
                data: {},
                dataType: 'JSON'
            });
}
private function3()
{
  return  $.ajax({
                type: "POST",
                url: url3,
                data: {},
                dataType: 'JSON'
            });
}

电流输出为

a
b
c
a
b
c