如何停止运行Node.JS的异步代码

时间:2019-07-11 08:39:02

标签: node.js

我正在创建一个程序,在该程序中我会不断运行和停止异步代码,但是我需要一种停止代码的好方法。

目前,我已尝试方法:

方法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,因此程序正在等待请求,如果没有这两种方法之一,则很难停止代码。

1 个答案:

答案 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 }