使用WebAssembly时,onRuntimeInitialized()有一个回调。基本上,您什么都做不了。
因此,如果您在其中实现了一个库,则必须说:
var mylib = require('mylib')
mylib.onRuntimeInitialized = function() {
...
// Anything that wants to use *anything* from mylib
// (doesn't matter if it's synchronous or asynchronous)
...
}
从好的方面来说,您不是让Node等待做任何可能不依赖于mylib的初始化...,以便其他模块可以进行提取或它们所需的任何操作。不利的一面是,它的人机工程学非常糟糕,尤其是如果您所做的一切都依赖于此库。
一种可能似乎是将初始化折叠成一个承诺,然后等待:
var mylib = require('mylib')
await mylib.Startup()
但是人们显然write about how much they don't like the idea of top-level AWAIT。我对此的看法与任何一种方式都不相关,因为这是不允许的。 :-/
那么,除了将整个应用包装在回调中之外,真的没有办法在顶层保留代码吗?
答案 0 :(得分:1)
Node要注意的一件事是,无论调用了哪个文件,require
都将返回相同的对象。顺序固然重要,但所有文件中的对象都是相同的。
因此,在您的主要index.js
中,您可以做类似
var myLib = require('mylib')
myLib.libby = myLib.initialize()
,然后在另一个文件doesStuff.js
中,您可以执行以下操作:
const libby = require('mlib').libby
module.exports = function doStuff() {
/* do stuff with initialized libby object */
}
通常,此方法的工作方式是doStuff.js
中的调用直到所有内容都初始化并说处理了Web路由后才被调用。因此您的服务器已经在运行,因此libby
将被初始化并在调用后即可使用。
如果您遇到的某些事情绝对不能失败,例如,如果数据库连接失败或其他原因,服务器将无法运行,那么等待是适当的,所以是的,您需要包装所有内容(至少是您操作的核心)在回调中,以便服务器知道何时可以安全启动。