如何在返回新承诺内延迟执行

时间:2020-07-11 18:50:31

标签: javascript promise async-await delay

我正在使用JavaScript使用基于网络的算法可视化工具,因此在执行过程中需要暂停。为了暂停执行,我使用了const delay = ms => new Promise(res => setTimeout(res, ms));并调用了函数await delay(500);,我在堆栈溢出时发现了该函数,它在非递归算法下可以正常工作。为了使递归算法具有顺序性,我使用了return new Promise((resolve,reject).then()。但是现在我无法在return new Promise内使用await,这是什么原因,我走上了正轨吗? 我的代码看起来像这样(快速排序)

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 个答案:

答案 0 :(得分:1)

您不需要return new Promise(...,因为异步函数已经返回了Promise。您不能使用await,因为Promise处理程序不是异步函数。试试这个:

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
};