强制JavaScript运行异步递归循环

时间:2019-07-25 19:45:10

标签: javascript php recursion promise

我正在设置一个基于浏览器的应用程序,该应用程序应执行一些外部代码。因此,我使用了一些JavaScript代码,(递归地)显示了一个计数器,并且应该执行一些外部php代码后记(一些耗时的任务)。

例如,重复此过程。按顺序3倍。

我尝试通过使用Promise来强制每个函数等待较低的函数(例如,intermediateFunction等待heavyTask)来设置配置。

通过使用await,我试图强制循环异步运行。

function heavyTask(i) {
  return new Promise((resolve, reject) => {
    $.ajax({
      ....[i]..... // do something for file i in .php
      success: function (result) {
        if (result.error) {
          reject(result.error_msg);
        } else {
          resolve(result.filename);
        }
      },
      error: function (xhr, status, error) {
        reject(error.error_msg); 
      }
    });
  });
}


function intermediateFunction(i) {
  return new Promise((resolve, reject) => {
    //display some stuff
    heavyTask(i)
       .then(filename => resolve(filename))
       .catch(error_msg => reject(error_msg));
  });
}

function countdown(i) {
  function timerFunction() {
    current--;
    if (count < 3) {
      console.log('Count ' + count)
      window.setTimeout(timerFunction, 1000);
    } else {
      console.log('Counter done:'+ filename));
      intermediateFunction(i).then(filename => console.log('Loop: '+filename));
    }
    count++;
  }
  count = 0;
  timerFunction();
}


async function start () {
 for(let i = 1; i <= x; i++){
      console.log('Start timerFunction');
      await countdown(i);
      console.log('End timerFunction');
  }
postprocessing();
}

到目前为止,代码还没有异步运行。 countdown()函数也可以并行执行,而postprocessing()在countdown()之前执行:

Start timerFunction
Count 0 
End timerFunction 
Start timerFunction
Count 0
End timerFunction 
Start timerFunction 
Count 0 
End timerFunction 
Count 1 
Count 2
Count 3 
Count 4
Counter done: 2 (core.js, line 191)
Counter done: 3 (core.js, line 191)
Counter done: 1 (core.js, line 191)
Loop: 3
Loop: 2
Loop: 1

0 个答案:

没有答案