gpt4 book ai didi

javascript - 在异步函数中的 JavaScript 中暂停和取消暂停循环

转载 作者:行者123 更新时间:2023-12-01 01:51:56 25 4
gpt4 key购买 nike

我有一个异步函数,它有一个循环,我需要能够暂停或取消暂停它。这就是我到目前为止所拥有的。

我使用标志来暂停流程:

let flag = true;

function flag_func() {
flag = !flag;
}


$(document).ready(function () {
function sleep(ms) {
while (!flag) {
//...waiting.. but infinite loop
}
return new Promise(resolve => setTimeout(resolve, ms));
}
async function show_simulation(data) {
document.getElementById("solve-button").outerHTML = "<button type=\"button\" id='pause-button' onclick='flag_func()' class=\"btn btn-primary btn-lg\">Pause</button>";
//simulation
if (data.length === 0) {
console.log('stuff')
} else {
let i;
for (i = 0; i < data.length; i++) {
await sleep(40);
// do stuff
}
}
}
});

问题是正在暂停,但由于 while 阻止了流程,我无法取消暂停 for 循环。

知道如何解决这个问题吗?

最佳答案

这可能是异步迭代的一个很好的用例。它涉及一些样板文件来创建异步列表,但代码要好得多。基本上你会:

import AsyncList from './async-list.js'

const sleep = (ms) => new Promise(r => setTimeout(r, ms));

async function f(data) {
const list = new AsyncList(data);

document.getElementById("btn-toggle").addEventListener("click", function () {
if (list.paused) {
this.textContent = "Pause";
list.resume();
} else {
this.textContent = "Resume";
list.pause()
}
})


for await (let item of list) {
console.log(item)
await sleep(1000);
}
console.log("end of loop")
}

f([10, "hello", 1029, 90, 80, 209, 44])

AsyncList 的可能实现可能是:

export default class AsyncList {
constructor(array) {
// shallow copy
this._array = array.slice();

this._index = 0;
this._length = this._array.length;
this.paused = false;
this._resume = () => {}; // noop, in case `resume` is called before `pause`
}

[Symbol.asyncIterator]() {
return this;
}

pause() {
this.paused = true;
}

resume() {
this.paused = false;
this._resume();
}

next() {
if (this._index < this._length) {
const value = this._array[this._index++];

if (this.paused) {
return new Promise(r => this._resume = r.bind(null, { value }))
}

return Promise.resolve({ value })
} else {
return Promise.resolve({ done: true });
}
}
}

只是为了给你一个想法,你还可以封装私有(private)属性,并检查更多场景(这里我假设 data 是一个数组,例如,而不仅仅是一个可迭代的)。

关于javascript - 在异步函数中的 JavaScript 中暂停和取消暂停循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51412013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com