自定义节点同步功能

时间:2017-10-23 11:44:48

标签: javascript node.js asynchronous synchronization

Node提供了两种核心功能,包括同步和异步。

fs.readFileSync这样的同步功能在启动应用时非常有用,例如在npm包dotenv中。

是否可以编写不需要asyncawait关键字的自定义同步功能,从而绕过承诺和回调地狱?

1 个答案:

答案 0 :(得分:2)

  

是否可以编写一个不需要async和await关键字的自定义Sync函数,从而绕过promise和callback hell?

是。只是让该函数只使用它调用的任何API函数的Sync版本。

如果函数 使用异步API函数或模块,那么不,你不能(随时)制作自己的同步版本(你也不想)。您可以触发单独的子进程来执行异步工作并同步等待它(execSyncspawnSync)...(我不记得具体内容,但至少有一个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)非常重要,以避免出现未处理的拒绝错误函数的承诺(记住,async函数返回承诺)被拒绝。