同步需求,因此整个Node.js脚本都不会回调

时间:2019-02-15 16:25:33

标签: 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 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。我对此的看法与任何一种方式都不相关,因为这是不允许的。 :-/

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

1 个答案:

答案 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将被初始化并在调用后即可使用。

如果您遇到的某些事情绝对不能失败,例如,如果数据库连接失败或其他原因,服务器将无法运行,那么等待是适当的,所以是的,您需要包装所有内容(至少是您操作的核心)在回调中,以便服务器知道何时可以安全启动。