同步要求使整个Node.js脚本不';回调中的t

同步要求使整个Node.js脚本不';回调中的t,node.js,async-await,webassembly,Node.js,Async Await,Webassembly,使用WebAssembly时,onRuntimeInitialized()有一个回调。在它发生之前,你基本上什么都做不了 因此,如果您有一个在其中实现的库,您必须说: var mylib = require('mylib') mylib.onRuntimeInitialized = function() { ... // Anything that wants to use *anything* from mylib // (doesn't matter if it's

使用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)
    ...
}
另一方面,您不会让节点等待执行任何可能不依赖mylib的初始化…因此其他模块可以执行抓取或任何他们需要的操作。从消极的一面看,这是相当糟糕的人体工程学——特别是如果你所做的一切都依赖于这个库

一种可能性似乎是将初始化等待折叠成承诺,然后等待:

var mylib = require('mylib')
await mylib.Startup()
但是人们显然是这样的。我对这件事的看法与任何一方面都毫不相干,因为这是不允许的-/


那么,除了在回调中包装整个应用程序之外,真的没有办法在顶层保存代码了吗?

对于Node,需要注意的一点是,
require
s将返回相同的对象,无论在哪个文件中调用require。顺序固然重要,但在所有文件中都是相同的对象

因此,在main
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 */
}
典型的工作方式是,在初始化所有内容并表示web路由已处理之前,不会调用
doStuff.js
。因此,您的服务器已经在运行,因此
libby
将被初始化并在调用后准备好使用


如果您有一些绝对不能失败的东西,例如如果DB连接不成功,服务器将不会运行,或者其他什么东西,那么等待是合适的,因此是的,您需要将所有内容(至少是操作的核心)打包到回调中,以便您的服务器知道何时可以安全启动

“如果您有一些绝对不能失败的东西,比如数据库连接不成功时服务器不会运行,或者其他什么东西,那么等待是合适的”WebAssembly
onRuntimeInitialized()
基本上就是这样。是平台本身在加载。:/在准备就绪之前,我无法为从webassembly调用任何内容的任何其他对象(例如express
app.get()
)注册任何回调,以免回调提前发生。对。听起来你的建议很管用。虽然顶级等待或完全同步启动并不典型,但如果在某个东西初始化之前一切都会中断,那么在我看来,等待该东西准备好是可以的,因为如果不是这样,您就不会有太多程序了!:)