如何中止(停止)循环执行的承诺链? - JavaScript

How to Abort (Stop) a chain of promises, executed in a loop? - JavaScript

我有一个 Web 应用程序,其中有两个按钮:"start download" 和 "abort download",它们分别绑定到方法:start()stop()
1. 当用户点击 "start download" 按钮时,应用程序将遍历一个数据数组。对于数组中的每一项,它将调用 _downloadFile() 方法下载一个文件和 return 一个 new Promise(),下载完成后将开始下一次下载。
2. 如果在下载过程中(可能需要很长时间)用户点击了"abort download"按钮我想停止下载。

如何实现中止功能?
这是我到目前为止得到的结果?

请注意,由于我使用的是 async/await,循环将停止,直到 promise 被解决,下一次迭代只会在 promise 被解决(或被拒绝)后执行。

async function start(dataArray)
{
  for (let i = 0; i < dataArray.length; i++)
  {
    try
    {
      let fileUrl = `http://server-url/${ i }/${ dataArray[i] }.xml`;
      let result = await _downloadFile(fileUrl);
      _saveResult(result);
    }
    catch(e) // promise rejected
    {
      _handleError(e);
    }
  }
}

function stop()
{
  // what goes here?? how do I stop the flow??
}

function _downloadFile(fileUrl)
{
  return new Promise((resolve, reject) =>
  {
    // ...
  });
}

function _saveFile(data) 
{
  // ..
}

function _handleError(error)
{
  console.error("Error: " + error);
}

设置函数可以检查的标志,如果已设置,throw。 (好吧,您实际上是在代码中将拒绝转换为解决方案,所以也许您不 throw,只是 return 早。[我不会那样做,顺便说一句。])

let stopped = false; // *** The flag
async function start(dataArray)
{
  stopped = false;                                  // *** Re-init the flag
  for (let i = 0; i < dataArray.length; i++)
  {
    try
    {
      let fileUrl = `http://server-url/${ i }/${ dataArray[i] }.xml`;
      let result = await _downloadFile(fileUrl);
      if (stopped) {                                // *** Check the flag
          return;                                   // *** and return
      }
      _saveResult(result);
    }
    catch(e) // promise rejected
    {
      _handleError(e);
    }
  }
}

function stop()
{
  // *** Set the flag
  stopped = true;
}