Javascript、jQuery:如何在更多的 LOOPS 中编写嵌套的 Promise?

Javascript, jQuery: How to write nested Promises in LOOPS in more LOOPS?

提问人: 提问时间:6/13/2023 更新时间:6/13/2023 访问量:63

问:

在这种情况下,可以使用哪种 JavaScript 或 jQuery 构造的回调和/或承诺?它能做到吗?

我尝试了这个最小的例子(/vocab 和 /vocab2 是 REST 服务):

 "use strict";

 window.onload = function(e)
 { 
    console.log("HELLO WORLD");

    var promises = [];
    promises.push(doxxx());

    Promise.all(promises).then(
       dozzz();
    );
 }

function doxxx()
{
   console.log('doxxx CALLED');
    $.ajax({
       url: '/vocab', 
       type: 'POST',
       dataType: 'json',
     success: function(result) 
     {
         console.log(result.data);
         var promises = [];
         $.each(result.data,  function( index, value )
         {
            promises.push(doyyy(value[3]));
         });

         return Promise.all(promises);
      }
  });
 }

 function doyyy(german)
 {
    console.log('doyyy CALLED');
   $.ajax({
      url: '/vocab2', 
      type: 'POST',
     data: {german : german},
     dataType: 'json',
     success: function(result) 
     {
       return new Promise(function(myResolve, myReject) 
       {
         console.log(result.data);
       })
    }
 });
}

function dozzz()
{
   console.log("END");
}

我希望在调用 dozzz() 并将“END”打印到控制台之前,所有嵌套的承诺都会被填满。

但它没有用。它在“doxxx CALLED”和“doyyy CALLED”之前打印了“END”。

更新

我尝试了亚历山大·内纳舍夫(Alexander Nenashev)的答案。 成功了。 谢谢。

控制台输出顺序正确

JavaScript jQuery Promise 回调 嵌套

评论

0赞 Bergi 6/13/2023
a) 不要这样做,使用在单个请求中提供所有数据的 API 端点 b) 不要使用 / c) 使用 / 与顺序循环一起使用,或使用forEach$.eachasyncawaitPromise.all
0赞 Jaromanda X 6/13/2023
知道 jQuery.ajax(或多或少,取决于版本)返回 Promise 也可能有所帮助

答:

0赞 Alexander Nenashev 6/13/2023 #1

使用它将使代码更易于管理、可读和维护。async/await

 "use strict";

 window.onload = async function(e)
 { 
    console.log("HELLO WORLD");
    await doxxx();
    dozzz();
}

async function doxxx()
{
   console.log('doxxx CALLED');
   
   const result = await $.ajax({
       url: '/vocab', 
       type: 'POST',
       dataType: 'json',
   });
   
   console.log(result.data);
   
   return Promise.all($.map(result.data, (_, value) => doyyy(value[3])));
 }

 async function doyyy(german)
 {
    console.log('doyyy CALLED');
    
    const result = await $.ajax({
      url: '/vocab2', 
      type: 'POST',
     data: {german : german},
     dataType: 'json',
  });
 
  console.log(result.data);
}

function dozzz()
{
   console.log("END, but not the END");
}