我正在创建一个程序,在该程序中我会不断运行和停止异步代码,但是我需要一种停止代码的好方法。
目前,我已尝试方法:
方法1:
当一个方法正在运行时,另一个方法被调用来停止第一个方法时,我启动了一个无限循环以阻止该代码运行,然后从队列(数组)中删除该方法
我100%确信这是完成此操作的最糟糕的方法,而且它的工作原理很麻烦。
代码:
class test{
async Start(){
const response = await request(options);
if(stopped){
while(true){
await timeout(10)
}
}
}
}
代码2:
var tests = [];
Start(){
const test = new test();
tests.push(test)
tests.Start();
}
Stop(){
tests.forEach((t, i) => {t.stopped = true;};
tests = [];
}
方法2:
我将不同的方法加载到Workers中,当我需要停止代码时,我只是终止了Worker。
创建工作程序通常要花费很多时间(1秒),因此并不是最佳方法,因为我需要代码在没有1-2秒暂停的情况下运行。
代码:
const Worker = require("tiny-worker");
const code = new Worker(path.resolve(__dirname, "./Code/Code.js"))
停止:
code.terminate()
还有其他方法可以停止异步代码吗?
程序包含使用nodejs Request-promise模块的Request,因此程序正在等待请求,如果没有这两种方法之一,则很难停止代码。
答案 0 :(得分:1)
还有其他方法可以停止异步代码吗?
请牢记Nodejs的工作原理。我认为这里有些误会。
它在实际上下文中执行实际功能,如果遇到异步操作,则事件循环将在将来某个地方调度它的执行。无法删除该计划执行。
有关事件循环here的更多信息。
通常,为了处理这种情况,您应该使用标志或信号灯。
程序包含使用nodejs Request-promise模块的Request,因此程序正在等待请求,很难停止代码
如果您需要硬“停止代码”,则可以执行类似的操作
func stop() {
process.exit()
}
但是,如果我做对了,您每x次启动请求,有时需要停止发送请求而不管理响应。
您无法取消安排响应管理部分的时间,但是可以在其中添加一些逻辑(当运行该部分时),以检查“请求循环”是否已停止。
let loop_is_stopped = false
let sending_loop = null
func sendRequest() {
const response = await request(options) // "wait here"
// following lines are scheduled after the request promise is resolved
if (loop_is_stopped) {
return
}
// do something with the response
}
func start() {
sending_loop = setInterval(sendRequest, 1000)
}
func stop() {
loop_is_stopped = true
clearInterval(sending_loop)
}
module.exports = { start, stop }