как отложить выполнение внутри возврата нового обещания - PullRequest
0 голосов
/ 11 июля 2020

Я работаю над веб-инструментом визуализации алгоритмов, использующим javascript, поэтому ему нужна пауза во время выполнения. Чтобы приостановить выполнение, я использовал const delay = ms => new Promise(res => setTimeout(res, ms)); и вызвал функцию await delay(500);, которую я обнаружил при переполнении стека, она отлично работала с нерекурсивным алгоритмом. А чтобы сделать рекурсивный алгоритм последовательным, я использовал return new Promise((resolve,reject) и .then(). но теперь я не могу использовать ожидание внутри return new Promise, в чем причина, и я на правильном пути? мой код выглядит так (быстрая сортировка)

const quick = async(low, high) => 
{   
  return new Promise((resolve,reject) =>
  {

    if (low < high)  
    {  
  
      var pivot = color[high]
      var i = low -1 
  
      for(var j = low; j <= high - 1; j++) 
      {
        // I want some delay here
        if(color[j] < pivot)
        {
          i++
          swap(i,j)  
         // delay here
        }
  
      }
      var pi = i+1;  
  
      swap(pi,high)
  
      // and delay here

      quick( low, pi - 1).then(quick( pi + 1, high));
     
    }
    resolve();
  });
}

1 Ответ

1 голос
/ 11 июля 2020

Вам не нужно return new Promise(..., потому что asyn c функции уже возвращают обещания. Вы не можете использовать await, потому что обработчик обещаний не является функцией asyn c. Попробуйте это:

const quick = async (low, high) => {
    if (low < high) {
        var pivot = color[high];
        var i = low - 1;

        for (var j = low; j <= high - 1; j++) {
            await delay(500);

            if (color[j] < pivot) {
                i++;
                swap(i, j);
                // delay here
            }
        }
        var pi = i + 1;

        swap(pi, high);

        await delay(500);

        await quick(low, pi - 1);
        await quick(pi + 1, high);
    }
    // return is implicit
};
...