【发布时间】:2017-02-15 18:58:35
【问题描述】:
我有一个需要连续运行功能的应用程序。该函数返回一个承诺。我希望应用程序等到承诺解决后再启动该功能。
此外,我的应用程序需要一个 start 和 stop 函数来分别启动或停止该函数。
我这里有一个简化的例子:
class App {
constructor() {
this.running = false
this.cycles = 0
}
start() {
this.running = true
this._run()
}
stop() {
this.running = false
}
_run() {
Promise.resolve().then(() => {
this.cycles++
}).then(() => {
if (this.running) {
this._run()
}
})
}
}
module.exports = App
我的问题是,当我使用这个时,setTimeout 似乎放弃了我。例如,如果我运行这个:
const App = require("./app")
const a = new App()
a.start()
console.log("a.start is not blocking...")
setTimeout(() => {
console.log("This will never get logged")
a.stop()
console.log(a.cycles)
}, 500)
输出将是:
a.start is not blocking...
然后setTimeout 回调中的代码永远不会被调用。
我可以尝试在命令行上开始运行 node 并直接在 REPL 中输入,但在我调用 a.start() 后,终端冻结,我无法再输入任何内容。
这种事情看起来应该是很常见的模式。例如,Express 允许您启动/停止服务器而不会出现这些问题。我需要做什么才能获得这种行为?
【问题讨论】:
-
这种类型的应用程序称为“服务”。我知道在 .Net 世界中,您可以创建一个类型为“Windows 服务”的项目,然后将其注册为任何计算机上的服务,使用控制面板/管理工具/服务停止/启动它。我认为你应该调查一下。
标签: javascript node.js asynchronous recursion promise