【问题标题】:Custom node sync function自定义节点同步功能
【发布时间】:2018-04-03 22:53:23
【问题描述】:

Node 提供了 2 种风格的大量核心功能,同步和异步。

fs.readFileSync 等同步函数在启动应用时非常有用,例如在 npm 包 dotenv 中。

是否可以编写一个不需要async 和await 关键字的自定义同步函数,从而绕过承诺和回调地狱?

【问题讨论】:

  • “但它们不能用于类结构或更典型的应用程序的 server.js 起点” 是的,在这两种情况下都可以。
  • 删除了不正确的陈述。
  • Is it possible to write a custom Sync function that does not require the async and await keywords thus bypassing the promise and callback hell? 这没有意义,你没有回调地狱,甚至在使用 async / await 时没有 thenables,这就是它们的全部意义。
  • 是的,我的问题更适合不必使用 async 或 await 关键字,但也不必使用回调或承诺。

标签: javascript node.js asynchronous synchronization


【解决方案1】:

是否可以编写一个不需要 async 和 await 关键字的自定义 Sync 函数,从而绕过承诺和回调地狱?

是的。只需让该函数仅使用它调用的任何 API 函数的同步版本即可。

如果函数必须使用异步 API 函数或模块,那么不,您不能(轻易)制作自己的同步版本(也不想)。您可以启动一个单独的子进程来执行该异步工作并同步等待它(execSync,spawnSync)...(我不记得具体细节,但有至少有一个 npm 模块出于某种原因这样做......)


...但它们不能用于类结构或更典型的应用程序的 server.js 起点...

是的,在这两种情况下都可以。这是一个例子:

function somethingAsync() {
  return new Promise(resolve => {
    setTimeout(resolve, 400, Math.floor(Math.random() * 10));
  });
}

// Using async/await in a class:
class Example {
  async doSomething() {
    let a = await somethingAsync();
    return a * 2;
  }
}

// Using async/await in a top-level script:
(async () => {
  try {
    const ex = new Example();
    console.log("Waiting...");
    const v = await ex.doSomething();
    console.log(v);
  } catch (e) {
    console.error("Error: ", e);
  }
})();

请注意,在该异步函数的主体周围使用try/catch 非常重要(或在其返回值上使用.catch),以避免在函数的promise 时出现未处理的拒绝错误(请记住, async 函数返回承诺)被拒绝。

【讨论】:

  • 嗯,有道理。将不得不做一些阅读..你是否碰巧知道这是否是readFileSync在幕后工作的方式?
  • 这可能是术语,但doSomething 不是方法调用,不是类构造..?爱华;函数构造函数不返回承诺,但无论如何我都会使用方法调用。
  • @John:如果“这个”是指“仅使用 API 调用的同步版本”,我认为答案基本上是“是的”。例如,您可以找到readFileSync here。它只使用openSync、readSync 等。一些最低级别的操作只是在 Node 的底层 C++ 代码中同步实现,使用平台上可用的同步(而不是异步)I/O 调用。
  • @Keith:我用“类构造”来指代整个事物;请注意“构造”中缺少“或”。 (对class、for 或switch 之类的东西使用“构造”是相当普遍的。)是的,构造函数不能返回承诺(当然,除非它们是承诺构造函数:-)),但正如你所说,一般来说,等到方法调用而不是从构造函数内部开始任何异步进程可能会更好......
  • 感谢您的详细解答!很有帮助
猜你喜欢
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多