如何中止(停止)循环执行的承诺链? - 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;
}
我有一个 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;
}