同步要求所以整个Node.js脚本不在回调中
使用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。我对它的看法无论如何都是无关紧要的,因为它是不允许的。 : - /
那么除了在回调中包装整个应用程序之外,真的没有办法在顶层保持代码吗?
回答如下:Node要注意的一点是,require
s将返回相同的对象,无论调用哪个文件都需要。顺序确实很重要,但它将是所有文件中的同一个对象。
所以在你的主要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
将被初始化,并且一旦被调用就可以使用了。
如果你有一些绝对不会失败的东西,比如服务器在数据库连接不成功的情况下就不会运行,那么等待是合适的,所以是的,你需要将所有内容(至少是你的行动的核心)包装在一个回调,以便您的服务器知道何时可以安全启动。
同步要求所以整个Node.js脚本不在回调中
使用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。我对它的看法无论如何都是无关紧要的,因为它是不允许的。 : - /
那么除了在回调中包装整个应用程序之外,真的没有办法在顶层保持代码吗?
回答如下:Node要注意的一点是,require
s将返回相同的对象,无论调用哪个文件都需要。顺序确实很重要,但它将是所有文件中的同一个对象。
所以在你的主要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
将被初始化,并且一旦被调用就可以使用了。
如果你有一些绝对不会失败的东西,比如服务器在数据库连接不成功的情况下就不会运行,那么等待是合适的,所以是的,你需要将所有内容(至少是你的行动的核心)包装在一个回调,以便您的服务器知道何时可以安全启动。