Node提供了两种核心功能,包括同步和异步。
像fs.readFileSync
这样的同步功能在启动应用时非常有用,例如在npm包dotenv中。
是否可以编写不需要async
和await
关键字的自定义同步功能,从而绕过承诺和回调地狱?
答案 0 :(得分:2)
是否可以编写一个不需要async和await关键字的自定义Sync函数,从而绕过promise和callback hell?
是。只是让该函数只使用它调用的任何API函数的Sync版本。
如果函数 使用异步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
)非常重要,以避免出现未处理的拒绝错误函数的承诺(记住,async
函数返回承诺)被拒绝。