我正在研究如何在mocha runner事件中等待异步函数的执行。例如,我有一个定制的摩卡记者,有一个事件:
function MyReporter(runner) {
Base.call(this, runner);
runner.on('suite end', function(suite) {
Testlogger.flush()
});
}
mocha.utils.inherits(MyReporter, mocha.reporters.spec);
Testlogger.flush() -是一个带有回调的函数,或者是带有承诺(具有异步逻辑的东西)的函数。在我的例子中,类似于回调:
fs.writeFile(where, what, (err) => {
if(err) {
callback("error")
} else {
callback("done")
}
});
或者承诺回报的东西:
const test = promisify(fs.writeFile)
return test.call(null, where, what)
或者它可以使用本地JS承诺
因此,我的观点是,该函数应该以异步方式工作,这种“异步”的形式可能并不重要。我知道事件是同步的,我尝试了很多不同的选择,但都失败了。此外,我还对mocha中的魔术not ()函数进行了讨论,但没有找到健壮的示例。当然,如果我使用fs.writeFileSync()函数,没有问题。
我如何迫使运行者等待我的异步函数来处理事件?
发布于 2022-11-16 04:57:58
最近遇到了类似的事情。我们用的是柏树9号。
从这个链接中学习:https://github.com/cypress-io/cypress/issues/7139,这似乎是摩卡跑步者的“设计”。
所以你可以用两个选择来解决这个问题。
选项1
启动带有--no-exit
标志的摩卡跑步者。
我没有尝试过这个选择,因为这对我们来说不是一个选择。但基于上面的链接,它听起来似乎是可行的。尽管这可能不会阻止事件处理程序函数,因此取决于您正在做的事情可能无法工作。
选项2
同样受到上面的柏树问题链接的启发,应该利用一个去异步库,比如去异步或去异步-承诺。因此,上面的代码就变成了这样:
runner.on('suite end', function(suite) {
deasyncPromise(Testlogger.flush())
});
https://stackoverflow.com/questions/55119940
复制相似问题